#include <unistd.h> #include <stdio.h> #include<signal.h> int main(void) { signal(SIGCHLD, SIG_IGN); //一般来说在做并发服务器的时候,都要将这个加上!可以防止因为子进程退出时,父进程没时间处理,而产生僵尸进程! int i=0; printf("i son/pa ppid pid fpid "); //ppid指当前进程的父进程pid //pid指当前进程的pid, //fpid指fork返回给当前进程的值 for(i=0;i<2;i++){ pid_t fpid=fork(); if(fpid==0) {printf("%d child %4d %4d %4d ",i,getppid(),getpid(),fpid); while(1); } else { printf("%d parent %4d %4d %4d ",i,getppid(),getpid(),fpid);} } return 0; } 无论有没有signal(SIGCHLD, SIG_IGN); 这句,产生的两个子进程,输出没有变化 [root@linux Desktop]# gcc a.c [root@linux Desktop]# ./a.out i son/pa ppid pid fpid 0 parent 4643 6269 6270 0 child 6269 6270 0 1 child 6269 6271 0 1 parent 4643 6269 6271 [root@linux Desktop]# ./a.out i son/pa ppid pid fpid 0 parent 4643 6422 6423 1 parent 4643 6422 6424 [root@linux Desktop]# 1 child 1 6424 0 0 child 1 6423 0 //从上面的输出结果可以看出产生的两个子进程都是父进程产生的,分别为6270(i=0)和6271(i=1)两个子进程,按道理来说第二次循环中子进程还可以创建一个子进程,这样就符合规律了,本应该创建3个子进程,但是为啥创建了两个子进程是因为第一次循环时即(i=0)父进程创建的子进程6270陷入了无限循环之中,所以没发在第二次循环中再次创建子进程!这样就可以理解了,为啥只创建一个子进程了! [root@linux Desktop]# ps --ppid 1 1号进程为init进程,父进程死亡,子进程被init进程接管 6270 pts/6 00:00:18 a.out //部分截图 6271 pts/6 00:00:18 a.out 6423 pts/6 00:00:00 a.out 6424 pts/6 00:00:00 a.out #include <unistd.h> #include <stdio.h> #include<signal.h> int main(void) { signal(SIGCHLD, SIG_IGN);//把这行代码注释掉,仍然没有啥变化 int i=0; printf("i son/pa ppid pid fpid "); //ppid指当前进程的父进程pid //pid指当前进程的pid, //fpid指fork返回给当前进程的值 for(i=0;i<2;i++){ pid_t fpid=fork(); if(fpid==0) {printf("%d child %4d %4d %4d ",i,getppid(),getpid(),fpid); while(1); } else { printf("%d parent %4d %4d %4d ",i,getppid(),getpid(),fpid);} } while(1); //这句是必须的不然服务器程序会执行完后会退出程序!这样就不能接到客户端的请求了! return 0; } [root@linux Desktop]# gcc a.c [root@linux Desktop]# ./a.out i son/pa ppid pid fpid 0 parent 2667 2725 2726 1 parent 2667 2725 2727 0 child 2725 2726 0 1 child 2725 2727 0 //注意这儿阻塞住了,可以用ctrl+c输出没有变化 [root@linux Desktop]# ps aux | grep -w 'Z' root 2709 2.0 0.0 4336 792 pts/2 S+ 18:58 0:00 grep -w Z //注意没有僵尸进程产生 [root@linux Desktop]# [root@linux Desktop]# ps aux | grep -w 'Z' root 2738 0.0 0.0 4336 820 pts/2 S+ 18:58 0:00 grep -w Z [root@linux Desktop]# [root@linux Desktop]# ps --ppid 1 PID TTY TIME CMD 516 ? 00:00:00 udevd 1467 ? 00:00:00 vmware-vmblock- 1487 ? 00:00:01 vmtoolsd 1617 ? 00:00:00 auditd 1635 ? 00:00:00 portreserve 1642 ? 00:00:00 rsyslogd 1695 ? 00:00:01 dbus-daemon 1706 ? 00:00:00 NetworkManager 1709 ? 00:00:00 modem-manager 1717 ? 00:00:00 wpa_supplicant 1721 ? 00:00:00 avahi-daemon 1732 ? 00:00:00 cupsd 1757 ? 00:00:00 acpid 1766 ? 00:00:00 hald 1835 ? 00:00:00 sshd 1873 ? 00:00:00 tpvmlp 1945 ? 00:00:00 mysqld_safe 2107 ? 00:00:00 abrtd 2115 ? 00:00:00 abrt-dump-oops 2123 ? 00:00:01 crond 2134 ? 00:00:00 atd 2149 ? 00:00:00 rhsmcertd 2166 ? 00:00:00 gdm-binary 2171 tty2 00:00:00 mingetty 2175 tty3 00:00:00 mingetty 2177 tty4 00:00:00 mingetty 2179 tty5 00:00:00 mingetty 2184 tty6 00:00:00 mingetty 2217 ? 00:00:00 console-kit-dae 2290 ? 00:00:00 dbus-launch 2296 ? 00:00:00 devkit-power-da 2338 ? 00:00:00 polkitd 2349 ? 00:00:00 rtkit-daemon 2367 ? 00:00:00 gnome-keyring-d 2384 ? 00:00:00 dbus-launch 2385 ? 00:00:00 dbus-daemon 2399 ? 00:00:00 gconfd-2 2403 ? 00:00:03 gnome-settings- 2409 ? 00:00:00 seahorse-daemon 2411 ? 00:00:00 gvfsd 2420 ? 00:00:00 gvfs-fuse-daemo 2439 ? 00:00:00 bonobo-activati 2447 ? 00:00:00 trashapplet 2448 ? 00:00:01 wnck-applet 2450 ? 00:00:00 gvfs-gdu-volume 2454 ? 00:00:00 udisks-daemon 2456 ? 00:00:02 vmtoolsd 2469 ? 00:00:00 pulseaudio 2484 ? 00:00:00 gvfs-gphoto2-vo 2487 ? 00:00:00 gvfs-afc-volume 2502 ? 00:00:00 gdm-user-switch 2503 ? 00:00:00 clock-applet 2504 ? 00:00:00 notification-ar 2505 ? 00:00:00 gnote 2510 ? 00:00:00 gvfsd-trash 2513 ? 00:00:00 restorecond 2522 ? 00:00:00 gnome-screensav 2536 ? 00:00:00 packagekitd 2540 ? 00:00:01 notification-da 2617 ? 00:00:00 gvfsd-burn 2631 ? 00:00:00 gvfsd-metadata 2652 ? 00:00:02 gedit 2665 ? 00:00:03 gnome-terminal [root@linux Desktop]#