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

问题描述 投票:1回答:1

为什么在下面的代码中,没有显示输出。当我评论该行时:“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;
}
operating-system pipe
1个回答
1
投票

但问题是你在没有读卡器的情况下写入管道。根据specification of POSIX write,当写入只打开一端的管道时,应该引发错误:

[EPIPE]

尝试写入未通过任何进程读取的管道或FIFO,或只打开一端的管道或FIFO。 SIGPIPE信号也应发送给线程。

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

由于写入标准输出大多数时候是缓冲的,程序没有时间刷新输出,这使得它看起来好像没有执行cout << "checking";的行。如果你在写'输入'后写了std::cout.flush();,你会在终端上看到它。

© www.soinside.com 2019 - 2024. All rights reserved.