进程控制_进程等待

子进程退出时,父进程若不作处理就会造成僵尸进程的问题。所以子进程运行完成,需要知道它的结果是对是错,亦或是有没有正常退出。

父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

wait()函数:

    wait函数一旦调用,就会将自己阻塞,并开始监控并等待当前进程的子进程,在子进程退出时返回。
wait的一个参数 int* status 是一个输出型参数,用来获取子进程的退出状态,可以置为NULL不考虑子进程的退出状态。

	#include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <sys/wait.h>
  5 
  6 int main()
  7 {
  8     int ret = fork();
  9     if(ret==0)
 10     {
 11         //child
 12         printf("child running/n");
 13         sleep(100);                                                                                                                                                                    
 14         exit(0);                                         
 15     }                                                    
 16     else
 17     {
 18         //father
 19         wait(NULL);
 20         printf("father running");
 21     }
 22 }     

这里的代码让子进程等待100秒,以便于我们观察当前的各进程的状态。
通过查看进程
在这里插入图片描述
可以看到当前父进程的状态是等待状态。

关于status参数的输出

  • 正常退出
  • 异常退出(通过信号截断)

在这里插入图片描述

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <unistd.h>
  4 #include <sys/wait.h>
  5 
  6 int main()
  7 {
  8     int ret = fork();
  9     if(ret==0)
 10     {
 11         //child
 12         printf("child running\n");
 13         sleep(3);
 14         exit(88);
 15     }
 16     else
 17     {
 18         //father
 19         int status;
 20         wait(&status);
 21         printf("the status is '%d'\n",(status>>8)&0xff);                                                                                                                               
 22         printf("father running\n");
 23     }
 24 }

子进程退出码为88
在这里插入图片描述
waitpid()函数:

waitpid(pid_t pid,int* status,int option)
参数:

  • pid:
    - 负1:等待任意进程
    - 输入pid,等待当前输入pid的进程
  • stauts:
    - 同wait的status
  • option:
    - 0:以阻塞方式
    - WNOHANG:非阻塞方式

需要注意的是 如果选用非阻塞方式,父进程不会阻塞等待,而是直接返回,有可能导致僵尸进程的方式,所以一般配合while使用,非阻塞的返回是0

while(waitpid(-1,NULL,WNOHANG)==0)
发布了52 篇原创文章 · 获赞 13 · 访问量 5426

猜你喜欢

转载自blog.csdn.net/MPF1230/article/details/104201160