目录
进程等待的必要性:
1:回收僵尸,解决内存泄露
2:需要获取子进程的运行状态
3:尽量父进程要晚于子进程退出,可以规范化进行资源回收
进程等待的方法:
wait方法(测试):
#include<stdio.h>
2 #include<sys/types.h>
3 #include<sys/wait.h>
4 #include<unistd.h>
5 int main()
6 {
7 pid_t id = fork();
8 if(id < 0)
9 {
10 perror("fork");
11 return 1;
12 }
13 else if(id ==0)
14 {
15 int count = 5;
16 while(count)
17 {
18 printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
19 sleep(1);
20 }
21 printf("child quit...\n");
E> 22 exit(0);
23 }
24 else
25 {
26 printf("father is waiting...\n");
27 pid_t ret = wait(NULL);
28 printf("father is wait done,ret:%d\n",ret);
29 }
30 return 0;
31 }
waitpid方法(测试):
int main()
6 {
7 pid_t id = fork();
8 if(id == 0)
9 {
10 int count = 5;
11 while(count)
12 {
13 printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
14 sleep(1);
15 }
16 printf("child quit ...\n");
E> 17 exit(0);
18 }
19 sleep(8);
20 //father
21 pid_t ret = waitpid(id,NULL,0);
22 printf("father wait done,ret:%d\n",ret);
23 sleep(3);
24 }
完整的等待过程:
int main()
6 {
7 pid_t id = fork();
8 if(id == 0)
9 {
10 int count = 5;
11 while(count)
12 {
13 printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
14 sleep(1);
15 }
16 printf("child quit ...\n");
E> 17 exit(10);
18 }
19 int status = 0;
20 pid_t ret = waitpid(id,&status,0);
21 if(ret > 0)
22 {
23 printf("wait succes!\n");
24 if((status & 0x7F) ==0)
25 {
26 printf("process quit normal!\n");
27 printf("exit code : %d\n",(status >> 8)&0xFF);
28 }
29 else{
30 printf("process quit error!\n");
31 printf("sig:%d\n",status&0x7F);
32 }
33 }
34 }
错误测试:
系统提供了一堆的宏,可以用来判断退出码,退出状态
if(ret > 0)
22 {
23 printf("wait success!\n");
24 if(WIFEXITED(status))
25 {
26 printf("normal quit!\n");
27 printf("quit code:%d\n",WEXITSTATUS(status));
28 }
29 else
30 {
31 printf("process quit error!\n");
32 }
}
进程的阻塞/非阻塞等待:
目前我们所调用的函数,都是阻塞函数
如何理解阻塞等待:父进程在等(将当前进程放入等待队列,并将进程状态设置为非R状态),子进程在跑
非阻塞等待的相关代码:
int main()
6 {
7 pid_t id = fork();
8 if(id == 0)
9 {
10 int count = 5;
11 while(count)
12 {
13 printf("child is running:%d,ppid:%d,pid:%d\n",count--,getppid(),getpid());
14 sleep(1);
15 }
16 printf("child quit ...\n");
E> 17 exit(10);
18 }
19 int status = 0;
20 while(1)
21 {
22 pid_t ret = waitpid(id,&status,WNOHANG);
23 if(ret == 0)
24 {
25 printf("wait next !\n");
26 printf("father do other thing!\n");
27 }
28 else if(ret > 0)
29 {
30 printf("wait succes,ret:%d,code:%d\n",ret,WEXITSTATUS(status));
31 break;
32 }
33 else{
34 printf("wait failed!\n");
35 break;
36 }
37 }
38 }