我想通过命名管道链接几个程序的stdin和stdout。这些程序就像服务或守护进程,所以我希望它们能够继续读取FIFO,直到它们因为FIFO被清除而被阻塞为止。我将问题C++: Read from stdin as data is written into pipe中的答案中的代码修改如下,以验证我的想法:
#include <iostream>
int main() {
char input;
while(1){
while(std::cin>>input){
std::cout<<input;
}
}
}然后,我将其编译成一个名为t的可执行文件。现在打开一个终端并输入以下命令:
mkfifo ff
./t > ff并打开一个新的终端并输入以下内容:
./t < ff现在,第一终端的输入将出现在第二终端上,第二终端中的t一旦读取了FIFO中的所有字符,就会被阻塞。现在一切都很好,但是当我在第一个终端中终止t时,第二个终端中的t不再被阻塞,但是FIFO已经被清除,即使删除了FIFO,也很快就占用了100%的CPU。
我的问题:
t退出时第二个t没有被阻塞?t退出时保持第二个t被阻塞;H 117也许我关于通过FIFO链接程序的整个想法是错误的。是否有更好的实践来连接shell中几个程序的stdin和stdout?
发布于 2020-12-09 07:03:27
为什么在我的情况下第一个t退出时第二个t没有被阻塞?
当第一个t终止时,它在fifo上生成一个文件结束,第二个t不再被阻塞。
仍然是为了在第一个t退出时保持第二个t被阻塞。
这是进程间通信(IPC)中的一个问题。对IPC机制(fifo,这里)的输入/输出应该在C++程序中完成。
是否有更好的实践来连接shell中多个程序的stdin和stdout?
如果进程是相关的,则可以通过管道运算符进行连接。否则,使用具有重定向的fifo似乎是唯一的方法。
https://stackoverflow.com/questions/65210159
复制相似问题