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