
如何「交叉」兩個程序的stdin
and ?stdout
具體來說,我有兩個程式稱為pgm1
和pgm2
,它們是互動式井字遊戲。它們都輸出一個數字(0到8)指示要標記的位置,並期望另一個數字(0到8)指示使用者想要標記的位置。兩者的差別在於pgm1
先動和pgm2
後動。它們都可以透過互動式使用者正常運作。可以使用 io 重定向讓它們互相對抗嗎?
我徒勞地嘗試了以下事情:
- 在單獨的終端機中開啟
pgm2
(等待輸入),找到它的 pid。然後pgm1
在另一個終端 運行./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
- 使用 mkfifo 製作了 2 個管道,例如
pipe1
andpipe2
並在兩個不同的終端中運行以下命令:./pgm1 < pipe1 > pipe2
和./pgm2 < pipe2 > pipe1
- 嘗試了以上兩個,在 pgm2 之前運行 pgm1,在 pgm1 之前運行 pgm2
我確保fflush(stdout)
在使用printf()
.
誰能告訴我我錯過了什麼/或出了什麼問題/或者這是否可能?
答案1
您應該能夠讓它與 FIFO 和管道一起工作。
$ mkfifo fifo
$ ./pgm2 < fifo | ./pgm1 > fifo
程式二的輸入是fifo,輸出到管道。程式的輸入是管道,輸出是fifo。
但請注意:這通常非常活躍,如果進程之間的「ping/pong」不完美,則可能會陷入僵局。
另請參閱此堆疊溢位問題:如何將第二個行程的標準輸出重新導向回第一個行程的標準輸入?
答案2
你陷入了僵局:./pgm1 < pipe1 > pipe2
而且./pgm2 < pipe2 > pipe1
open("pipe1", O_RDONLY)
shell 在執行之前完成的操作將阻塞,直到其他東西在同一管道上pgm1
寫入。open
在完成之前,不會進行下一步open("pipe2", O_WRONLY)
。
另一個也一樣。 willopen("pipe2", O_RDONLY)
會阻塞,而且open("pipe2", O_WRONLY)
由於另一個 shell 正在等待 上的寫入者pipe1
,因此不會完成,因此您遇到了死鎖。
你寫過嗎
pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2
它會起作用的。
在Linux上,還可以這樣寫:
{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :