日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux基础知识——wait函数和waitpid函数回收子进程

發布時間:2024/7/19 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux基础知识——wait函数和waitpid函数回收子进程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.wait函數回收子進程

\qquad父進程可以調用wait()函數回收子進程的終止信息。wait函數有三個功能:
\qquad阻塞等待子進程退出
\qquad回收子進程殘留資源
\qquad獲取子進程結束狀態(退出原因)

#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include <sys/wait.h> #include <sys/types.h>int main() {pid_t pid,wpid;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");}else if(pid>0){ wpid = wait(NULL);if(wpid==-1){perror("wait error");exit(1);}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使用wait(&status)獲取子進程結束的狀態,然后把status傳給宏函數來進一步判斷進程終止的原因。
\qquadWIFEXITED(status)為非0,即為真,則進程正常結束,然后使用WEXITSTATUS(status),獲取進程的退出狀態,即exit函數的參數。

\qquadWIFSIGNALED(status)為非0,即為真,則進程異常終止,然后使用WTERMSIG(status),獲取終止進程的那個信號的編號。
\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; }

\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 8000

2.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函数回收子进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。