Chinaunix

标题: wait()? [打印本页]

作者: andyY    时间: 2003-06-11 19:31
标题: wait()?
想用wait()来获得任一子进程的结束

#include "sys/types.h"
#include "sys/wait.h"
#include "stdio.h"
main()
{
        pid_t pid;
        if((pid=fork())<0)
        {printf("fork error.";
                exit(0);
        }
        else if (pid==0)
        {
                printf("1 ID:%d\n",getpid());
                if ((pid=fork())<0)
                {printf("fork error.";
                        exit(0);
                }
                else if (pid==0)
                {        printf("2 ID:%d\n",getpid());
                        exit(0);
                }
                else sleep(2);
        }
        else printf("ID:%d end.",wait(NULL));
}

应该是 “2 ID” 先结束吧,但是输出是:
1 ID:x
2 ID:y
//等两秒
ID:x end.
小弟新来!谢了先![/code][/code]
作者: uiibono    时间: 2003-06-11 22:18
标题: wait()?
楼上的你觉得结果有什么不妥吗?
偶觉得很正常啊。
作者: andyY    时间: 2003-06-11 23:01
标题: wait()?
我觉得main应该有个进程,wait 是等待 1 ID或者2 ID有一个结束后就执行;
而 1 ID sleep(2),2 ID输出就exit了,所以是 2ID先结束,
else printf("ID:%d end.",wait(NULL)); 的输出应该是:ID:y end.(2 ID)

对吗?
作者: blublusky    时间: 2003-06-12 09:40
标题: wait()?
你WAIT的地方是ID2进程的父亲的父亲,应该在ID1里的那个ELSE里WAIT
作者: shaoyijun    时间: 2003-06-12 10:48
标题: wait()?
[quote]原帖由 "blublusky"]你WAIT的地方是ID2进程的父亲的父亲,应该在ID1里的那个ELSE里WAIT[/quote 发表:
     
那如果我希望没一个子进程结束时我都可以得到它,是否我每次pid=fork()后,
pid>;0处都要wait????
作者: andyY    时间: 2003-06-12 12:53
标题: wait()?
blublusky 写到:
你WAIT的地方是ID2进程的父亲的父亲,应该在ID1里的那个ELSE里WAIT

wait()不能对所有的子孙进程都等待结束吗?
作者: 蓝色键盘    时间: 2003-06-12 13:08
标题: wait()?
if((pid=fork())<0)
{printf("fork error.";
exit(0);
}
else if (pid==0)
{
printf("1 ID:%d\n",getpid());
if ((pid=fork())<0)
{printf("fork error.";
exit(0);
}
else if (pid==0)
{ printf("2 ID:%d\n",getpid());
exit(0);
}
else sleep(2);
}
else printf("ID:%d end.",wait(NULL));
}
如上代码导致产生许多的子进程和孙子进程。

如果位了测试wait或者waitpid或wait3或wait4系列函数的功能和用法可以用层次比较小的frok。当然如上的代码可以保证让所有的子进程wait完。
在第一个fork的父亲用waitpid,第二个fork的父亲用waitpid。如果多个,循环调用waitpid实现。

论坛中类似的问题讨论了很多。可以参考。
作者: shaoyijun    时间: 2003-06-12 18:22
标题: wait()?
原帖由 "蓝色键盘" 发表:
if((pid=fork())<0)
{printf("fork error.";
exit(0);
}
else if (pid==0)
{
printf("1 ID:%d\n",getpid());
if ((pid=fork())<0)
{printf("fork error.";
exit(0);
}
else if (pid==..........
   
对呀,父进程都会执行printf("ID:%d end.",wait(NULL));
所以都会释放,是这样么?/
作者: 蓝色键盘    时间: 2003-06-12 18:41
标题: wait()?
父进程创建一个子进程。子进程又创建了子进程。
最后wait的时候,父进程处理了创建的第一个子进程。
第一个子进程wait了父进程的孙子。
作者: andyY    时间: 2003-06-13 18:30
标题: wait()?
反复看了书,回顾了下忘了的e文,总算明白了。
只wait子进程的
谢谢!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2