1、僵死进程
僵死进程:子进程先结束,父进程没有调用wait()来获取子进程退出码,那么子进程就会变成僵死进程,当僵死进程的父进程也运行完之后,会称为孤儿进程,此时会由INIT来将其回收,然后父子进程一同结束。
PID TTY TIME CMD
2791 pts/0 00:00:00 bash
3014 pts/0 00:00:00 僵死?程
3015 pts/0 00:00:00 僵死?程 <defunct>
3016 pts/0 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ ./僵死进程 &
[1] 3014
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=2791,pid=3014
s=child,ppid=3014,pid=3015
s=child,ppid=3014,pid=3015
s=parent,ppid=2791,pid=3014
s=child,ppid=3014,pid=3015
s=parent,ppid=2791,pid=3014
pss=parent,ppid=2791,pid=3014
PID TTY TIME CMD
2791 pts/0 00:00:00 bash
3014 pts/0 00:00:00 僵死?程
3015 pts/0 00:00:00 僵死?程 <defunct>
3016 pts/0 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=2791,pid=3014
ps
PID TTY TIME CMD
2791 pts/0 00:00:00 bash
3014 pts/0 00:00:00 僵死?程
3015 pts/0 00:00:00 僵死?程 <defunct>
3017 pts/0 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=2791,pid=3014
2、解决僵死进程:
子进程推出之后会产生子进程退出码,需要父进程用**wait()**来获取,然后将结束的子进程销毁,如果子进程没结束,wait会阻塞。
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<assert.h>
4 #include<unistd>
5 int main()
6 {
7 int n=0;
8 char*s=NULL;
9
10 pid_t id=fork();
11 assert(id!=-1);//断言复制进程成功了
12
13 if(id==0)//如果id=0代表的是子进程
14 {
15 s="child";
16 n=3;
17 }
18 else
19 {
20 s="parent";
21 n=7;
22 }
23 //解决僵死进程
24 int val =0;
25 int id =wait(&val);//利用wait将结束之后的子进程结束,但子进程未结束之前就会使父进程阻塞。
26 if(WIFEXITED(val))
27 {
28 printf("id=%d,val=%d\n",id,WEXITSTSTATUS(val));
29 }
30 //
31 for(int i=0;i<n;i++)
32 {
33 printf("s=%s,ppid=%d,pid=%d\n",s,getppid(),getpid());//获得父进程pid,获得pid
34 sleep(1);
35 }
36 exit(3);
37 }
stu@stu-virtual-machine:~/Test/Forkex$ ./处理僵死进程 &
[1] 38099
stu@stu-virtual-machine:~/Test/Forkex$ id=-1,val=0
s=child,ppid=38099,pid=38100
s=child,ppid=38099,pid=38100
s=child,ppid=38099,pid=38100
id=38100,val=3
s=parent,ppid=3502,pid=38099
^C
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=3502,pid=38099
./处理僵死进程 &s=parent,ppid=3502,pid=38099
s=parent,ppid=3502,pid=38099
^C
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=3502,pid=38099
s=parent,ppid=3502,pid=38099
s=parent,ppid=3502,pid=38099
^C
[1]+ 退出 3 ./处理僵死进程
stu@stu-virtual-machine:~/Test/Forkex$ ./处理僵死进程 &
[1] 38101
stu@stu-virtual-machine:~/Test/Forkex$ id=-1,val=0
s=child,ppid=38101,pid=38102
ps=child,ppid=38101,pid=38102
ss=child,ppid=38101,pid=38102
PID TTY TIME CMD
3502 pts/1 00:00:00 bash
38101 pts/1 00:00:00 处理僵死?
38102 pts/1 00:00:00 处理僵死?
38103 pts/1 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ id=38102,val=3
s=parent,ppid=3502,pid=38101
ps=parent,ppid=3502,pid=38101
s
PID TTY TIME CMD
3502 pts/1 00:00:00 bash
38101 pts/1 00:00:00 处理僵死?
38107 pts/1 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=3502,pid=38101
s=parent,ppid=3502,pid=38101
ps
PID TTY TIME CMD
3502 pts/1 00:00:00 bash
38101 pts/1 00:00:00 处理僵死?
38108 pts/1 00:00:00 ps
stu@stu-virtual-machine:~/Test/Forkex$ s=parent,ppid=3502,pid=38101
s=parent,ppid=3502,pid=38101
s=parent,ppid=3502,pid=38101
^C
[1]+ 退出 3 ./处理僵死进程
退出码就是exit(3),3就是退出码,若为4四就是退出码。