进程等待

一、进程等待

1) 之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
    另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
    最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
    父进程通过进程等待的方式回收子进程资源,获取子进程的退出信息。
2) 进程等待的方法:wait
    wait    【pid_t wait(int*status);】返回子进程的PID。参数为输出型参数,用于父进程调用时获取子进程的退出状态(PCB)(父进程拿不到(子进程的状态独立),但wait是系统调用,所以由系统来获取该参数)。
    进程退出状态:完且正确,完但不正确,异常。进程结果是否正确由退出码决定,但异常情况下退出码无用,不过异常时会返回导致异常的信号编号。所以如果进程始终没有返回信号编号,则其退出非异常。 
    status  整型(一个整型无法表示多种退出状态),但整型有32个比特位,一分为二,高16位不关心,低16位再一分为二,分为低八位和次低八位(0-7位表示是否正常终止,8-15位为退出码)。
进程等待_第1张图片
    【正常退出时,信号为0。】
    【eg:信号为0,退出码为0:进程跑完,结果正确。】
    【eg:信号为0,退出码为1:进程跑完,结果不正确。】
    【eg:信号为1(此时其实只使用了其低7位,第8位为core dump,异常时将进程数据复制一份放到一个文件中,该文件为core文件),程序异常。】
3) 等待类型
    阻塞时等待(阻塞式调用):进程要等待资源而得不到推进时,产生阻塞时等待
    非阻塞时等待(非阻塞式调用):条件不成熟,返回做别的事情,这时发生非阻塞时待。   
   【大部分的接口是阻塞的】
4) 进程等待的方法:waitpid
    pid_ t waitpid(pid_t pid, int *status, int options);
   【返回值】:
  •     当正常返回的时候waitpid返回收集到的子进程的进程ID;
  •     如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;
  •     如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;
   【参数】:
  •     pid:
          Pid=-1,等待任一个子进程。与wait等效。
          Pid>0.等待其进程ID与pid相等的子进程。
  •     status:
          WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(查看进程是否是正常退出)
          WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)
  •     options:
          WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进程的ID。 (等待时不许阻塞)
5)  总结:
    如果子进程已经退出,调用wait/waitpid时,wait/waitpid会立即返回,并且释放资源,获得子进程退出信息。
    如果在任意时刻调用wait/waitpid,子进程存在且正常运行,则进程可能阻塞。
    如果不存在该子进程,则立即出错返回。
6) 信号可以终止进程,异常退出
    其实,进程的异常退出大部分都是因为收到了异常信号。
   【异常捕捉】:通过信号的捕捉

































你可能感兴趣的:(linux)