linux基础知识——wait函数和waitpid函数回收子进程
1.wait函數(shù)回收子進(jìn)程
\qquad父進(jìn)程可以調(diào)用wait()函數(shù)回收子進(jìn)程的終止信息。wait函數(shù)有三個(gè)功能:
\qquad阻塞等待子進(jìn)程退出
\qquad回收子進(jìn)程殘留資源
\qquad獲取子進(jìn)程結(jié)束狀態(tài)(退出原因)
\qquad使用wait(&status)獲取子進(jìn)程結(jié)束的狀態(tài),然后把status傳給宏函數(shù)來進(jìn)一步判斷進(jìn)程終止的原因。
\qquadWIFEXITED(status)為非0,即為真,則進(jìn)程正常結(jié)束,然后使用WEXITSTATUS(status),獲取進(jìn)程的退出狀態(tài),即exit函數(shù)的參數(shù)。
\qquadWIFSIGNALED(status)為非0,即為真,則進(jìn)程異常終止,然后使用WTERMSIG(status),獲取終止進(jìn)程的那個(gè)信號(hào)的編號(hào)。
\qquad子進(jìn)程的異常終止:
\qquaderror的錯(cuò)誤代碼:
#include<stdio.h> int main() {int a =5;int b;b = a/0;printf("%d\n",b);return 0; }\qquad運(yùn)行結(jié)果:
i am child,my id is 7244,my parent id is 7243 --------child die--------- 子進(jìn)程已經(jīng)被回收,異常結(jié)束,終止子進(jìn)程的信號(hào)為8 i am parent,my id is 7243,my son id is 7244\qquad子進(jìn)程的正常結(jié)束:
#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include <sys/wait.h> #include <sys/types.h>int main() {pid_t pid,wpid;int status;pid = fork();if(pid==0){printf("i am child,my id is %d,my parent id is %d\n",getpid(),getppid());sleep(5);printf("--------child die---------\n");exit(23);//execl("/home/linux/2_孤兒進(jìn)程/error"," ",NULL);}else if(pid>0){ wpid = wait(&status);if(wpid==-1){perror("wait error");exit(1);}else{if(WIFEXITED(status)){printf("子進(jìn)程已經(jīng)被回收,且正常結(jié)束,退出狀態(tài)為%d\n",WEXITSTATUS(status));}if(WIFSIGNALED(status)){printf("子進(jìn)程已經(jīng)被回收,異常結(jié)束,終止子進(jìn)程的信號(hào)為%d\n",WTERMSIG(status));}}printf("i am parent,my id is %d,my son id is %d\n",getpid(),pid);}else{perror("fork error");exit(1);}return 0; }\qquad程序運(yùn)行結(jié)果:
i am child,my id is 8000,my parent id is 7999 --------child die--------- 子進(jìn)程已經(jīng)被回收,且正常結(jié)束,退出狀態(tài)為23 i am parent,my id is 7999,my son id is 80002.waitpid函數(shù)回收子進(jìn)程
\qquadwaitpid函數(shù)有三個(gè)參數(shù),第一個(gè)可以指定回收子進(jìn)程的id,回收指定的子進(jìn)程;第二個(gè)和wait函數(shù)一樣,傳入?yún)?shù)int &status,可以傳出進(jìn)程下一步的判斷;第三個(gè)參數(shù)是int options,可以修改阻塞狀態(tài)。
pid_t waitpid(pid_t pid,int &status,int options);\qquad第一個(gè)參數(shù)pid:>0:指定子進(jìn)程;-1:任意回收一個(gè)子進(jìn)程;0:回收所有子進(jìn)程;<-1:回收指定進(jìn)程組內(nèi)的任意子進(jìn)程。
\qquad第三個(gè)參數(shù)options:當(dāng)參數(shù)為WNOHANG時(shí),為非阻塞狀態(tài);為0時(shí),阻塞等待狀態(tài)。
總結(jié)
以上是生活随笔為你收集整理的linux基础知识——wait函数和waitpid函数回收子进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机网络复习 数据链路层】3.4.3
- 下一篇: 计算机视觉——简介以及人脸数目检测