簡體   English   中英

當第二個子進程關閉管道的讀取結束時終止第一個子進程

[英]Killing first child process when second child process close reading end of pipe

我在使用shell的特定命令行時遇到麻煩: base64 /dev/urandom | head -c 1000 base64 /dev/urandom | head -c 1000

如您所見,第一個進程base64將永無止境的字符寫入管道,並且head將讀取前1000個字符,然后正確退出。

我知道管道的fd在每個子進程中都是重復的,並且如果在父進程中將其關閉,則不會在子進程中將其關閉,這會導致我遇到的問題。 在父級中關閉管道的讀取端時,它將不會發送SIGPIPE信號終止第一個進程,因為它仍將在子級中打開。

因此,基本上,在永無止境的過程中,它將嘗試成功寫入管道,因為在fork中,管道的讀取端將永遠不會關閉。

因此,當第二個進程完成讀取管道后,如何才能成功退出第一個進程,換句話說,如何在子進程之間共享SIGPIPE信號。

這段代碼是我進行管道,分叉和等待的部分:

void            exec_process(t_shell *sh, t_job *job, int *iofile)
{
    t_parse *parse;

    parse = init_parse(sh, job->process->cmd);
    if (check_builtins(parse->argv[0]))
    {
        if (iofile[0] != 0)
            job->process->stdio[0] = iofile[0];
        if (iofile[1] != 1)
            job->process->stdio[1] = iofile[1];
        launch_builtin(sh, parse, job);
    }
    else if ((job->process->pid = fork()) == 0)
    {
        if (iofile[0] != 0)
            job->process->stdio[0] = iofile[0];
        if (iofile[1] != 1)
            job->process->stdio[1] = iofile[1];
        launch_bin(parse, job);
    }
    free_parse(&parse);
    if (iofile[0] != 0)
        close(iofile[0]);
    if (iofile[1] != 1)
        close(iofile[1]);
 }

static void     launch_process(t_shell *sh, t_job *job)
{
    t_process   *process;
    int         iofile[2];
    int         pipefd[2];
    int         i;

    process = job->process;
    iofile[0] = 0;
    i = get_num_process(job->process);
    while (job->process)
    {
        if (job->process->next)
        {
            pipe(pipefd);
            iofile[1] = pipefd[1];
        }
        else
            iofile[1] = 1;
        exec_process(sh, job, iofile);
        iofile[0] = pipefd[0];
        job->process = job->process->next;
     }
     job->process = process;
     wait_for_job(sh, job, i);
 }

我有一個父母和兩個孩子,僅鏈接到父母。

有什么建議么? 謝謝

每個進程必須關閉不使用的管道末端,以便在其他進程終止時讀取或寫入調用失敗。

暫無
暫無

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

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