Что произойдет, если дочерний процесс не закроет канал от записи во время чтения?

Учитывая следующий код:

int main(int argc, char *argv[])
{
    int pipefd[2];
    pid_t cpid;
    char buf;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s \n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    cpid = fork();
    if (cpid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (cpid == 0) {    /* Child reads from pipe */
        close(pipefd[1]);          /* Close unused write end */

        while (read(pipefd[0], &buf, 1) > 0)
            write(STDOUT_FILENO, &buf, 1);

        write(STDOUT_FILENO, "\n", 1);
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);

    } else {            /* Parent writes argv[1] to pipe */
        close(pipefd[0]);          /* Close unused read end */
        write(pipefd[1], argv[1], strlen(argv[1]));
        close(pipefd[1]);          /* Reader will see EOF */
        wait(NULL);                /* Wait for child */
        exit(EXIT_SUCCESS);
    }
return 0;

}

Всякий раз, когда дочерний процесс хочет читать из канала, он должен сначала закрыть сторону канала от записи. Когда я удаляю эту строку close(pipefd[1]);из дочернего процесса if, Я в основном говорю, что «хорошо, ребенок может читать из канала, но я разрешаю родителю одновременно писать в канал»?

Если да, то что произойдет, если канал будет открыт как для чтения, так и для записи? Без взаимного исключения?

6
задан Jonathan Leffler 10 October 2017 в 21:51
поделиться