簡體   English   中英

wait()用於進程子崩潰

[英]wait() for the process child crash

我有以下程序

int external_apply(char *type)
{
    int pfds[2];
    if (pipe(pfds) < 0)
        return -1;

    if ((pid = fork()) == -1)
        goto error;

    if (pid == 0) {
        /* child */

        const char *argv[8];
        int i = 0;
        argv[i++] = "/bin/sh";
        argv[i++] = "script_file.sh";
        argv[i++] = "apply";

        close(pfds[0]);
        dup2(pfds[1], 1);
        close(pfds[1]);

        execvp(argv[0], (char **) argv);
        exit(ESRCH);

    } else if (pid < 0)
        goto error;

    /* parent */
    close(pfds[1]);

    int status;
    while (wait(&status) != pid) {
        printf("waiting for child to exit");
    }

    return 0;

error:
    close(pfds[0]);
    return -1;
}

fork調用我的腳本文件。 該腳本文件包含導致管道關閉(有時)的命令。 如果管道被管道封閉,則等待將導致程序崩潰。

當腳本關閉管道時,如何避免程序崩潰?

關於錯誤,請用_exit(-1)替換return -1

您可能正在接收SIGPIPE信號,但未處理,從而導致異常。

嘗試

signal(SIGPIPE, SIG_IGN);

並查看此問題/答案以了解詳細信息(或google SIGPIPE)。

您的代碼在錯誤的情況下會泄漏文件描述符。 如果發生錯誤,它也會關閉未初始化的文件描述符。

但是,您顯示的循環只有在wait返回一個不同的pid(如果您有更多的孩子正在運行)或它被中斷(在這種情況下,它返回-1)時才進入。 因此,對我來說,這看起來應該是正確的。 當孩子完成時,將永遠不會進入循環。 如果您認為程序崩潰,則應顯示調用此函數的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM