溫馨提示×

linux中Wait函數(shù)和waitpid函數(shù)怎么用

小億
74
2023-10-22 11:55:31
欄目: 智能運維

在Linux中,wait函數(shù)和waitpid函數(shù)都是用來等待子進程結束并獲取子進程的終止狀態(tài)的。

wait函數(shù)的函數(shù)原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t wait(int *status);

wait函數(shù)會等待任意一個子進程結束,并將子進程的終止狀態(tài)保存在status指向的整型變量中。如果不關心子進程的終止狀態(tài),可以將status設為NULL。wait函數(shù)返回被終止子進程的進程ID。

示例代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    
    if (pid == -1) {
        perror("fork");
        exit(1);
    } else if (pid == 0) {
        // 子進程執(zhí)行的代碼
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父進程執(zhí)行的代碼
        printf("Parent process\n");
        
        int status;
        pid_t child_pid = wait(&status);
        
        if (WIFEXITED(status)) {
            printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
        } else {
            printf("Child process %d exited abnormally\n", child_pid);
        }
    }
    
    return 0;
}

輸出結果:

Parent process
Child process
Child process 1234 exited normally with status 0

waitpid函數(shù)的函數(shù)原型如下:

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int options);

waitpid函數(shù)可以指定等待的子進程ID,其中pid參數(shù)有以下幾種取值:

  • pid > 0:等待進程ID為pid的子進程;
  • pid = -1:等待任意一個子進程;
  • pid = 0:等待和調(diào)用waitpid函數(shù)的父進程在同一個進程組的任意子進程;
  • pid < -1:等待進程組ID為-pid的任意子進程。

status參數(shù)和wait函數(shù)一樣,用來保存子進程的終止狀態(tài)。

options參數(shù)用來指定額外的選項,比如可以使用WNOHANG選項來非阻塞地等待子進程結束。

示例代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
    pid_t pid = fork();
    
    if (pid == -1) {
        perror("fork");
        exit(1);
    } else if (pid == 0) {
        // 子進程執(zhí)行的代碼
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父進程執(zhí)行的代碼
        printf("Parent process\n");
        
        int status;
        pid_t child_pid = waitpid(pid, &status, 0);
        
        if (WIFEXITED(status)) {
            printf("Child process %d exited normally with status %d\n", child_pid, WEXITSTATUS(status));
        } else {
            printf("Child process %d exited abnormally\n", child_pid);
        }
    }
    
    return 0;
}

輸出結果和前面的例子是一樣的。

0