進程等待wait,waitpid

wait函數

wait函數用於等待子進程中斷或者結束。
wait()函數會暫時停止目前進程的執行,直到有信號來到或者子進程結束爲止。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status返回,而子進程的進程識別碼也會一起返回。如果不在意結束狀態值,則參數status可以設成NULL。子進程的結束狀態值請參考waitpid()。

waitpid函數

可以看個實際的例子。

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

void die(const char *msg)
{
        perror(msg);
        exit(1);
}

void child2_do()
{
        printf("In child2: execute 'date'\n");

        sleep(5);
        if (execlp("date", "date", NULL) < 0) {
                perror("child2 execlp");
        }
}

void child1_do(pid_t child2, char *argv)
{
        pid_t pw;

        do {
                if (*argv == '1') {
                        pw = waitpid(child2, NULL, 0);
                }
                else {
                        pw = waitpid(child2, NULL, WNOHANG);
                }
                if (pw == 0) {
                        printf("In child1 process:\nThe child2 process has not exited!\n");
                        sleep(1);
                }
        }while (pw == 0);

        if (pw == child2) {
                printf("Get child2 %d.\n", pw);
                sleep(5);
                if (execlp("pwd", "pwd", NULL) < 0) {
                        perror("child1 execlp");
                }
        }
        else {
                printf("error occured!\n");
        }
}

void father_do(pid_t child1, char *argv)
{
        pid_t pw;

        do {
                if (*argv == '1') {
                        pw = waitpid(child1, NULL, 0);
                }
                else {
                        pw = waitpid(child1, NULL, WNOHANG);
                }

                if (pw == 0) {
                        printf("In father process:\nThe child1 process has not exited.\n");
                        sleep(1);
                }
        }while (pw == 0);

        if (pw == child1) {
                printf("Get child1 %d.\n", pw);
                if (execlp("ls", "ls", "-l", NULL) < 0) {
                        perror("father execlp");
                }
        }
        else {
                printf("error occured!\n");
        }
}

int main(int argc, char *argv[])
{
        pid_t child1, child2;

        if (argc < 3) {
                printf("Usage: waitpid [0 1] [0 1]\n");
                exit(1);
        }

        child1 = fork();

        if (child1 < 0) {
                die("child1 fork");
        }
        else if (child1 == 0) {
                child2 = fork();

                if (child2 < 0) {
                        die("child2 fork");
                }
                else if (child2 == 0) {
                        child2_do();
                }
                else {
                        child1_do(child2, argv[1]);
                }
        }
        else {
                father_do(child1, argv[2]);
        }

        return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章