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 | :

相关内容