如有错误,欢迎批评指正,本人也是才学APUE的菜鸟
今天在测试 APUE 对僵尸进程采用两个 fork 的技巧手段。
其代码是这样的:
#include "apue.h"
#include <sys/wait.h>
int main(void) {
printf("father pid = %ld\n", (long)getpid());
pid_t pid;
if((pid = fork()) < 0) {
err_sys("fork error");
} else if(pid == 0) {
if((pid = fork()) < 0)
err_sys("fork error");
else if(pid > 0) {
printf("first child pid = %ld , parent pid = %ld\n", (long)getpid(),(long) getppid());
exit(0); // 直接结束 first child
}
// now is second child
printf("before sleep: second child pid = %ld, parent pid = %ld\n", (long)getpid(),(long)getppid());
sleep(3);
printf("after sleep: second child pid = %ld, parent pid = %ld\n", (long)getpid(),(long)getppid());
exit(0);
}
if(waitpid(pid, NULL, 0) != pid) // wait for first child
err_sys("waitpid error");
exit(0);
}
ps:中间很多 printf 都是我自己加的。
然后在终端运行:
hjm@hjm-Inspiron:~/InterviewPreparation/apue/Examples/8-8$ ./8-8
father pid = 3984
first child pid = 3985 , parent pid = 3984
before sleep: second child pid = 3986, parent pid = 3985
after sleep: second child pid = 3986, parent pid = 1522
发现和书上的输出不大一样,重复测试了几次,在 after sleep 之后的 parent pid 都是 1522.
书上不是说,父进程先于子进程结束,子进程会被 init 收养吗,其 parent pid 应该是 1 才对啊。
---------解决-------------
搜到了一篇博客,提到:当用图形界面时,不会是 init 收养。
然后就听了博客上的,按 ctrl+alt+f1 进入了字符界面:
然后就是这样,什么也输入不了,听网上的按 ctrl + alt + f7 也没用。。。我一度以为是卡了,然后等了一会,就强制重启了。
重启后甚是不甘,再试了试,还是这样。。。
然后就脸滚键盘,按到了 ctrl+alt+f3,进入了 tty3:
试过了,可以用。也确实,运行了 8-8 程序,这此情况下,after sleep 后的 parent pid = 1
然后 ctrl+alt+f4 进入了 tty4,然后 tty5,tty6
最后按 ctrl+alt+f7,依旧不能退回图形界面,
然后 ctrl+alt+f2,居然回到了图形界面。。。。。网上不是说是 ctrl+alt+f7 吗????? wtf ??