中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

linux中Wait函數和waitpid函數怎么用

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

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

wait函數的函數原型如下:

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

pid_t wait(int *status);

wait函數會等待任意一個子進程結束,并將子進程的終止狀態保存在status指向的整型變量中。如果不關心子進程的終止狀態,可以將status設為NULLwait函數返回被終止子進程的進程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) {
        // 子進程執行的代碼
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父進程執行的代碼
        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函數的函數原型如下:

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

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

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

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

status參數和wait函數一樣,用來保存子進程的終止狀態。

options參數用來指定額外的選項,比如可以使用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) {
        // 子進程執行的代碼
        printf("Child process\n");
        sleep(3);
        exit(0);
    } else {
        // 父進程執行的代碼
        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
五家渠市| 班戈县| 中西区| 南靖县| 武冈市| 垫江县| 常宁市| 饶阳县| 日土县| 明溪县| 子长县| 和龙市| 翼城县| 鄱阳县| 遵义县| 观塘区| 乌拉特中旗| 浏阳市| 丰都县| 咸宁市| 大足县| 渝中区| 金沙县| 那曲县| 商城县| 北流市| 吉首市| 铜鼓县| 朝阳县| 凤城市| 古浪县| 陆川县| 怀仁县| 景泰县| 安仁县| 锦州市| 醴陵市| 礼泉县| 金门县| 和平县| 会宁县|