io重定向到「交叉」2個程序

io重定向到「交叉」2個程序

如何「交叉」兩個程序的stdinand ?stdout具體來說,我有兩個程式稱為pgm1pgm2,它們是互動式井字遊戲。它們都輸出一個數字(0到8)指示要標記的位置,並期望另一個數字(0到8)指示使用者想要標記的位置。兩者的差別在於pgm1先動和pgm2後動。它們都可以透過互動式使用者正常運作。可以使用 io 重定向讓它們互相對抗嗎?

我徒勞地嘗試了以下事情:

  1. 在單獨的終端機中開啟pgm2(等待輸入),找到它的 pid。然後pgm1在另一個終端 運行./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
  2. 使用 mkfifo 製作了 2 個管道,例如pipe1andpipe2並在兩個不同的終端中運行以下命令:./pgm1 < pipe1 > pipe2./pgm2 < pipe2 > pipe1
  3. 嘗試了以上兩個,在 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 | :

相關內容