如何“交叉”两个程序的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 | :