Зачем закрывать конец чтения канала, предотвращая выполнение оставшегося кода? - PullRequest
0 голосов
/ 18 февраля 2019

Почему в приведенном ниже коде выходные данные не отображаются. Когда я комментирую строку: "close (pipefd1 [0]);"тогда код работает хорошо, иначе он не печатает даже "проверку" на терминале.

#include<bits/stdc++.h>
using namespace std;
#include <stdlib.h>
#include <unistd.h>
int main(){
    int pipefd1[2];
    char buff[100]="hey there";
    char be[100];
    pipe(pipefd1);
    close(pipefd1[0]);
    cout<<"checking";
    write(pipefd1[1],buff,100);
    close(pipefd1[1]);
    read(pipefd1[0],be,100);
    close(pipefd1[0]);
    cout<<be;
}

1 Ответ

0 голосов
/ 24 апреля 2019

Проблема, однако, в том, что вы пишете в канал без ридера.В соответствии с спецификацией POSIX write, при записи в канал с открытым только одним концом должна возникать ошибка:

[EPIPE]

Anсделана попытка записи в канал или FIFO, который не открыт для чтения каким-либо процессом, или который имеет только один открытый конец.Сигнал SIGPIPE также должен быть отправлен в поток.

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

С момента записи на стандартный выводчаще всего буферизуется, программа не успевает очистить вывод, что выглядело так, как будто строка с cout << "checking"; не была выполнена.Если бы вы написали std::cout.flush(); после записи «проверки» на выходе, вы бы увидели это на своем терминале.

...