Файловые дескрипторы и канал в C - PullRequest
0 голосов
/ 25 июня 2018

У меня есть базовый канал в c, я отправил целое число в дочерний процесс, дочерний процесс увеличит это число на 1 и отправит обратно в родительский процесс.Мой вопрос: что происходит, если я закрываю дескриптор файла записи сразу после функции записи?Программа отобразит 1 (правильный вывод 2)

int main(){

    int p[2];

    pipe(p);

    int n=1;
    write(p[1], &n, sizeof(int));
    close(p[1]); // don't work => the output is 1

    if(fork() == 0) {
            read(p[0], &n, sizeof(int));
            n = n + 1;
            write(p[1], &n, sizeof(int));
            close(p[1]);
            close(p[0]);
            exit(0);
    }
    wait(0);
    read(p[0], &n, sizeof(int));
    close(p[0]);
    //close(p[1]);  works => the output is 2

    printf("%d\n", n);
    return 1;

}

1 Ответ

0 голосов
/ 25 июня 2018

Правильный вывод, конечно, не 2.Когда вы закрываете трубу перед разветвлением, оба процесса теперь работают как закрытые pipe[1].Когда дочерний процесс пытается записать в канал, он не сможет.Таким образом, родитель будет читать 1, потому что 2 никогда не записывался в pipe[1].

...