分类: LINUX
2011-04-25 14:39:48
|
在知道上面看到如下疑问:
#include
#include
#include
#include
#include
int main(void)
{
pid_t child1,child2,pid;
child1=fork();
child2=fork();
if(child1<0)
{
perror("fork child1 error!\n");
exit(1);
}
else if(child1==0)
if(execlp("/bin/ls","ls","-l",NULL)<0) //Can't show only one ls with -l!!
{
perror("exec error\n");
exit(1);
}
else printf("exec succeed!\n");
else {;}
//备注语句 修改的地方
if(child2<0)
{
perror("fork child2 error!\n");
exit(1);
}
else if(child2==0)
{
sleep(5);
exit(0);
}
else {
while((pid=waitpid(child2,NULL,WNOHANG))<=0)
if(pid<0)
{
perror("waitpid error\n");
exit(1);
}
printf("waitpid succeed!\npid is %d\n",pid);
exit(0);
}
}//为什么运行时屏幕上会打印两次ls -l
问题就是为什么红色标的语句会被执行两次?按说,父进程产生了两个子进程,只有第一个子进程才会执行execlp("/bin/ls","ls","-l",NULL),可实际运行的时候"ls -l"却会执行两次,其原因在什么地方呢?
其实问题的关键在这里:
child1=fork();
child2=fork();
从
这里可以看出,由父进程产生的第一个子进程,然后它会从child2=fork();这一句开始执行,立即再产生一个新的进程,为了区别我们称之为孙进
程,由于在子进程中child1的值为0,所以由子进程产生的孙进程中child1的值仍为0,到这里你就应该明白了吧?第一个子进程和其产生的孙进程执
行相同的代码,换句话说execlp("/bin/ls","ls","-l",NULL)会在两个进程中分别执行.这就是问题产生的根本原因.
导致问题的原因我们已经找出来了,那么具体应该怎样解决呢?很简单,将child2=fork();这一语句放到//备注语句这个位置,也就是if(child2<0)的前面就可以啦.
至于为什么可以这样解决问题,呵呵,自己好好想想吧