簡體   English   中英

后台傳輸到標准輸出

[英]Pipe to standard output in background

我有以下方案:

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

叔叔應該是唯一的控制輸出,因此我想到了使用由granpa創建並在fork()中與兒子共享的pipe() () 到現在為止還挺好。

問題在於, 叔叔還無限循環地從System V消息隊列( msgget() )讀取數據,因此充當服務器。

我的問題是:在沒有多線程的情況下,如何同時執行這些操作?

我想到的一些解決方案包括:

  1. 使用dup2()管道dup -ing到標准輸出,但是由於未知原因,它不起作用; 我猜這是因為內核不會自動將數據從管道緩沖區復制到終端輸出內存,這太酷了。
  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 這樣可以簡化大型的多管道項目,並減少客戶程序的工作量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM