15-练习
26.5 练习
26-1. 编写一程序以验证当一子进程的父进程终止时,调用getppid()将返回1(进程init的进程ID)。
26-2. 假设存在3个相互关联的进程(祖父、父及子进程),祖父进程没有在父进程退出之后立即执行 wait(),所以父进程变成僵尸进程。那么请指出孙进程何时被init进程收养(即孙进程调用 getppid()将返回 1),是在父进程终止后,还是祖父进程调用wait()后?请编写程序验证结果。
26-3. 使用 waitid()替换程序清单26-3(child_status.c)中的 waitpid()。需要将对函数 print WaitStatus()的调用替换为打印 waitid()所返回siginfo_t结构中相关字段的代码。
26-4. 程序清单26-4(make_zombie.c)调用了 sleep(),以便允许子进程在父进程执行函数system()前得到机会去运行并终止。这一方法理论上存在产生竞争条件的可能。修改此程序,使用信号来同步父子进程以消除该竞争条件。
①译者注:原文为“if on(previously unwaited-for)child of the calling process has yet terminated”。
②译者注:此处原文为previously unwaited-for。