首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的命名管道监测数据

C++中的命名管道监测数据
EN

Stack Overflow用户
提问于 2020-12-09 03:20:07
回答 1查看 412关注 0票数 0

我想通过命名管道链接几个程序的stdin和stdout。这些程序就像服务或守护进程,所以我希望它们能够继续读取FIFO,直到它们因为FIFO被清除而被阻塞为止。我将问题C++: Read from stdin as data is written into pipe中的答案中的代码修改如下,以验证我的想法:

代码语言:javascript
复制
#include <iostream>

int main() {            
    char input;
    while(1){
        while(std::cin>>input){                 
            std::cout<<input;
        }
    }
}

然后,我将其编译成一个名为t的可执行文件。现在打开一个终端并输入以下命令:

代码语言:javascript
复制
mkfifo ff
./t > ff

并打开一个新的终端并输入以下内容:

代码语言:javascript
复制
./t < ff

现在,第一终端的输入将出现在第二终端上,第二终端中的t一旦读取了FIFO中的所有字符,就会被阻塞。现在一切都很好,但是当我在第一个终端中终止t时,第二个终端中的t不再被阻塞,但是FIFO已经被清除,即使删除了FIFO,也很快就占用了100%的CPU。

我的问题:

  • 为什么在第一个t退出时第二个t没有被阻塞?
  • 无论如何都是为了在第一个t退出时保持第二个t被阻塞;

H 117也许我关于通过FIFO链接程序的整个想法是错误的。是否有更好的实践来连接shell中几个程序的stdin和stdout?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-09 07:03:27

为什么在我的情况下第一个t退出时第二个t没有被阻塞?

当第一个t终止时,它在fifo上生成一个文件结束,第二个t不再被阻塞。

仍然是为了在第一个t退出时保持第二个t被阻塞。

这是进程间通信(IPC)中的一个问题。对IPC机制(fifo,这里)的输入/输出应该在C++程序中完成。

是否有更好的实践来连接shell中多个程序的stdin和stdout?

如果进程是相关的,则可以通过管道运算符进行连接。否则,使用具有重定向的fifo似乎是唯一的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65210159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档