exec函数的几点疑惑,望解答
#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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
解答疑惑1:首先,这是一个多进程的程序,对于多进程与操作系统调度有关,这里仅仅是启用了多个进程,对于他们的执行顺序是由操作系统调度决定的,这与操作系统的调度策略有关。
解答疑惑2:他们都是父进程的子进程,因为第一个if(pid==0)中的代码是子进程的,本来后面的代码父进程和子进程都要执行的,也就是父进程和子进程都要再fork一次创建子进程,但是第一个子进程调用了exec,将第一个子进程的上下文完全替换(这也就是你的疑惑3),所以其下面的代码都不会执行,故而第一个子进程就不会执行下一个fork了,而父进程却可以继续执行,故而下一个fork仍然由父进程执行。
解答疑惑3:疑惑2解释中已经提到,这里是多进程的,而exec仅仅替换了子进程,而父进程仍然可以继续执行,这是两个独立的进程(处了具有父子关系)
看来楼主对多进程还是不是很清楚啊,你最好找本操作系统的书复习一下多进程的知识啊。。。
回复 2# chenxg0076
多谢这位大侠,学习了。。。。。。