为什么要关闭管道的读取端以阻止剩余代码执行?

时间:2019-02-18 11:37:50

标签: operating-system pipe

为什么在下面的代码中,没有显示输出。当我注释以下行:“ 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 :(得分:1)

但是,问题是您在没有读取器的情况下写入管道。对于specification of POSIX write,当仅在一端打开的情况下写入管道时,应引发错误:

  

[EPIPE]

     

试图写入未打开以供任何进程读取的管道或FIFO,或仅一端开放的管道或FIFO。 SIGPIPE信号也应发送到线程。

此错误导致您的程序直接终止,从而阻止了其余代码的执行。

由于大多数时间都是在缓冲标准输出的编写过程中,程序没有时间刷新输出,因此看起来好像未执行带有cout << "checking";的行。如果在对输出进行“检查”之后写了std::cout.flush();,那么您会在终端上看到它。