exec函数的几点疑惑,望解答

发布于 2022-10-15 06:55:40 字数 2996 浏览 19 评论 0

#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
        pid_t pid;  //进程标识变量
        char *para[]={"ls","-a",NULL};//定义参数数组,为execv所使用
        if((pid=fork())<0)   //创建新的子进程
        {
                perror("fork");
                exit (0);
        }
        if(pid==0)
        {
                if(execl("/bin/ls","ls","-l",(char*)0)==-1) //执行ls -l命令               
           {
                        perror("execl");
                        exit(0);
                }
                printf("Done!!");  //测试是否输出
        }
        
        if((pid=fork())<0)   //创建新的子进程
        {
                perror("fork");
                exit (0);
        }
        if(pid==0)
        {
                if(execv("/bin/ls",para)==-1) //执行ls -a 命令
                {
                        perror("execv");
                        exit(0);
                }

        }
        exit (0);
}

疑惑1:关于if的执行顺序:为什么这个程序首先出来的是 ls -a这个命令阿??ls -l中的if在前面阿??为什么不是他先出来呢??
疑惑2:程序中有2个if((pid=fork())<0)   //创建新的子进程;;他们都是父进程的子进程呢?还是子进程又创建了一个子进程呢??
疑惑3:exec是替换镜像,为什么还可以执行两个if判断呢??为什么不是执行了一个ls命令之后程序终止呢??

刚开始学习,有点不理解,望给予解答。。。。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

屌丝范 2022-10-22 06:55:40

解答疑惑1:首先,这是一个多进程的程序,对于多进程与操作系统调度有关,这里仅仅是启用了多个进程,对于他们的执行顺序是由操作系统调度决定的,这与操作系统的调度策略有关。
    解答疑惑2:他们都是父进程的子进程,因为第一个if(pid==0)中的代码是子进程的,本来后面的代码父进程和子进程都要执行的,也就是父进程和子进程都要再fork一次创建子进程,但是第一个子进程调用了exec,将第一个子进程的上下文完全替换(这也就是你的疑惑3),所以其下面的代码都不会执行,故而第一个子进程就不会执行下一个fork了,而父进程却可以继续执行,故而下一个fork仍然由父进程执行。
    解答疑惑3:疑惑2解释中已经提到,这里是多进程的,而exec仅仅替换了子进程,而父进程仍然可以继续执行,这是两个独立的进程(处了具有父子关系)
    看来楼主对多进程还是不是很清楚啊,你最好找本操作系统的书复习一下多进程的知识啊。。。

残疾 2022-10-22 06:55:40

回复 2# chenxg0076

    多谢这位大侠,学习了。。。。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文