gpt4 book ai didi

c - 在后台通过管道传输到标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:09 24 4
gpt4 key购买 nike

我有以下方案:

\
+ granpa
|
+--- uncle
|
+--- dad
|
+--- son1
+--- son2
+--- son3

叔叔应该是唯一一个控制输出的人,所以我想到了使用 granpa 创建的 pipe() 并通过 fork()< 与儿子共享/em>。到目前为止一切顺利。

问题是 uncle 还在无限循环中从 System V 消息队列 (msgget()) 读取数据,因此充当服务器。

我的问题是:在我们没有多线程的场景下,这些操作如何同时进行呢?

我想到的几个解决方案包括:

  1. dup - 使用 dup2() 将管道连接到标准输出,但由于未知原因无法正常工作;我猜这是因为内核不会自动将数据从管道缓冲区复制到终端输出内存,那太酷了。
  2. 后台使用 splice()tee() 从管道缓冲区复制数据,但看起来它们都是阻塞的并且不会在后台执行(或者可能他们这样做,而我做错了什么)。
  3. 使用 select() 在每个周期确定我是否有消息或要打印的内容,但不幸的是,System V 消息队列不是 Linux 内核中的文件描述符(而且我没有计划制作一个自定义版本的内核,就像互联网上有人为这个问题所做的那样,绝对)。

另一组实际可行但有点违反逻辑的解决方案是:

  1. 仅使用具有非常大结构的 System V 消息队列,并使用 msgtype 字段来确定我是在请求什么还是想要打印什么。太糟糕了。
  2. 代替使用 System V 消息队列,使用 socketpair() 和 do select()poll() 或其他.这是我的最终解决方案,但如果有人知道如何使用 System V Message Queues 来完成它,它是首选。

最佳答案

您可以尝试查看 Linux D-Bus .它旨在简化像这样的大型多管道项目,并为客户端程序提供更少的行数。

关于c - 在后台通过管道传输到标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41347351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com