[英]Pipe to standard output in background
我有以下方案:
\
+ granpa
|
+--- uncle
|
+--- dad
|
+--- son1
+--- son2
+--- son3
叔叔應該是唯一的控制輸出,因此我想到了使用由granpa創建並在fork()中與兒子共享的pipe()
() 。 到現在為止還挺好。
問題在於, 叔叔還無限循環地從System V消息隊列( msgget() )讀取數據,因此充當服務器。
我的問題是:在沒有多線程的情況下,如何同時執行這些操作?
我想到的一些解決方案包括:
dup2()
管道dup -ing到標准輸出,但是由於未知原因,它不起作用; 我猜這是因為內核不會自動將數據從管道緩沖區復制到終端輸出內存,這太酷了。 splice()
或tee()
從管道緩沖區進行后台復制數據,但看起來它們都被阻塞了,不會在后台執行(或者它們確實在做,而我做錯了)。 select()
在每個周期確定我是否有消息或要打印的東西,但是不幸的是,System V消息隊列不是Linux內核中的文件描述符(而且我沒有計划以某個人的身份創建內核的自定義版本)完全是在互聯網上做到的)。 可能實際上可行但有點違反邏輯的另一種解決方案是:
socketpair()
和do select()
或poll()
或其他方法。 這是我的最終解決方案,但是如果有人知道如何使用System V Message Queues,那么它是首選。 您可以嘗試研究Linux D-Bus 。 這樣可以簡化大型的多管道項目,並減少客戶程序的工作量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.