1 /*
2 ##wait()函数头文件:#include<sys/types.h> #include<wait.h>
3 ##原型:pid_t wait(int * status);
4 父进程调用wait()函数,可以回收子进程终止信息
5 1.阻塞等待子进程退出
6 2.回收子进程残留资源
7 3.获取子进程结束状态(退出原因)
8 wait()与fork()配套出现,若wait错误则返回-1,成功则返回子进程的pid
9 wait(NULL):直接回收子进程,不返回status指针
10 */
11 #include<sys/types.h>
12 #include<wait.h>
13 #include<stdio.h>
14 #include<stdlib.h>//perror()函数的头文件
15 #include<unistd.h>//pid_t,getpid()函数,fork()函数和sleep()函数的头文件
16 void main(void)
17 {
18 pid_t pid,wpid;
19 int status;
20 printf("____________YYYYYYYYYYYYYYY__________\n");
21 for(int i=0;i<1;i++){
22 pid = fork();
23 if(pid == -1){
24 perror("fork() is null\n");
25 }
26 else if (pid == 0){
27 printf("i am child , pid = %d , ppid = %d\n ",getpid(),getppid());
28 printf("i will go to sleep 20s\n");
29 sleep(10);
30 //exit(2);//子进程退出
31 }
32 else if(pid > 0){
33 wpid=wait(&status);//父进程阻塞等待,并且回收子进程资源,返回子pid与status值
34 //特别注意这里是指针要传入地址
35 printf("i am father , i waited myson, pid = %d , sonid = %d\n",getpid(),wpid);
36 if(wpid==-1){
37 perror("wait error\n");
38 }
39 //如果子进程正常退出,则打印子进程退出的编号
40 if(WIFEXITED(status)!=0){
41 printf("WEXITSTATUS number is %d\n",WEXITSTATUS(status));
42 }
43 //如果子进程异常退出(kill),则打印子进程退出时的信号
44 else if(WIFSIGNALED(status)!=0){
45 printf("myson is kill by %d\n",WTERMSIG(status));
46 }
47 }
48 }
49 }
06-03
971
03-16
276
08-09
688