在Linux下,waitpid()函數用于等待指定的子進程狀態改變,它的原型如下:
#include <sys/types.h>
#include <sys/wait.h>
pid_t waitpid(pid_t pid, int *status, int options);
其中,pid
參數指定要等待的子進程ID,可以有以下幾種取值:
如果pid > 0,則表示等待具有指定進程ID的子進程;
如果pid == 0,則表示等待與調用進程屬于同一個進程組的任意子進程;
如果pid == -1,則表示等待任意子進程,類似于wait()函數;
如果pid < -1,則表示等待進程組ID等于pid絕對值的任意子進程。
status
參數是一個整數指針,用于存儲子進程的終止狀態,可以為NULL。
options
參數用于設置等待的行為,可以是以下取值的組合:
WCONTINUED:等待一個被暫停的子進程恢復執行;
WNOHANG:如果沒有子進程狀態發生改變,則立即返回,而不阻塞;
WUNTRACED:等待一個被暫停的子進程或已經終止的子進程;
WSTOPPED:等待一個被暫停的子進程。
waitpid()函數的返回值是子進程的進程ID,如果出錯則返回-1。
示例代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status;
pid = fork();
if (pid < 0) {
perror("fork");
exit(1);
} else if (pid == 0) {
// 子進程
printf("Child process: PID=%d\n", getpid());
sleep(5);
exit(0);
} else {
// 父進程
printf("Parent process: PID=%d, Child PID=%d\n", getpid(), pid);
waitpid(pid, &status, 0);
if (WIFEXITED(status)) {
printf("Child process exited with status %d\n", WEXITSTATUS(status));
} else if (WIFSIGNALED(status)) {
printf("Child process terminated by signal %d\n", WTERMSIG(status));
} else if (WIFSTOPPED(status)) {
printf("Child process stopped by signal %d\n", WSTOPSIG(status));
}
}
return 0;
}
在上面的示例代碼中,父進程通過fork()函數創建了一個子進程,然后使用waitpid()函數等待子進程的狀態改變。在子進程中,它會暫停5秒鐘后退出。父進程在waitpid()函數返回后,根據子進程的終止狀態輸出相應的信息。
注意,waitpid()函數中的status參數需要傳入一個指針,用于存儲子進程的終止狀態。可以通過宏函數WIFEXITED、WEXITSTATUS、WIFSIGNALED、WTERMSIG、WIFSTOPPED和WSTOPSIG來判斷子進程是正常退出、異常終止還是被暫停等。