一、介紹waitpid函數
waitpid函數是Linux系統中的一種進程管理函數,在C語言中調用此函數可以獲取已經結束的子進程的狀態信息。在正常情況下,一個進程結束時可以通過waitpid函數獲取該進程的結束狀態信息,同時可以防止出現殭屍進程,為其他進程的正常運行提供了保障。
pid_t waitpid(pid_t pid, int *status, int options)
其中pid為要等待的子進程ID,status為進程結束狀態信息,options為等待的行為選項。
二、對waitpid函數的詳細解釋
1、pid參數的解釋
pid參數有以下幾種情況:
(1)pid>0時,表示等待進程ID為pid的子進程結束。
(2)pid=0時,表示等待與當前進程所在進程組ID相同的任意一個子進程結束。
(3)pid<-1時,表示等待進程組ID為-pid的任意一個子進程結束。
(4)pid=-1時,表示等待任意一個子進程結束。
2、status參數的解釋
status參數是一個int類型指針,用於存儲子進程狀態信息。
子進程的退出狀態信息可以用宏定義來解析:
#define WIFEXITED(status) (((status) & 0xFF) == 0)
#define WEXITSTATUS(status) (((status) & 0xFF00) >> 8)
3、options參數的解釋
options參數有以下三種情況:
(1)options=0時,阻塞等待子進程結束。
(2)options=WNOHANG時,表示不阻塞等待子進程結束,立即返回。
(3)options=WUNTRACED時,表示返回終止子進程信息和由於信號而引起的停止子進程信息。
三、示例代碼
下面是一個簡單的示例,父進程創建了多個子進程並等待它們結束。
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
int status;
int i;
for(i=0;i<5;i++){
pid=fork();
if(pid==-1){
perror("fork error");
exit(EXIT_FAILURE);
}
else if(pid==0){
printf("child %d: pid=%d\n",i,getpid());
exit(i);
}
}
for(i=0;i<5;i++){
pid=waitpid(-1,&status,0); //等待任意一個子進程結束
if(pid==-1){
perror("waitpid error");
}
else{
printf("child %d exited with status %d\n",pid,WEXITSTATUS(status));
}
}
return 0;
}
四、總結
waitpid函數是Linux操作系統中進程管理非常重要的函數之一,可以獲取子進程的結束信息,並且防止出現殭屍進程。我們在使用waitpid函數的時候,需要注意pid參數的四種情況,status參數的用法以及options參數的三種情況,避免出現一些誤用的情況。同時,在獲取子進程的退出狀態時,需要使用宏定義來解析狀態信息,才能獲得正確的退出狀態。
原創文章,作者:BRABM,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/371899.html