#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\n");
//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\n",i,getppid(),getpid(),fpid);
while(1); }
else {
printf("%d parent %4d %4d %4d\n",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\n");
//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\n",i,getppid(),getpid(),fpid);
while(1); }
else {
printf("%d parent %4d %4d %4d\n",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]#