io 2개 프로그램을 "교차"하도록 리디렉션

io 2개 프로그램을 "교차"하도록 리디렉션

stdin두 프로그램 을 "교차"하는 방법은 무엇입니까 stdout? 특히, 저는 2개의 프로그램 call 을 가지고 있는데 pgm1, pgm2그것들은 대화형 tic-tac-toe 게임입니다. 둘 다 표시하려는 위치를 나타내는 숫자(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개의 파이프를 만들고 두 개의 서로 다른 터미널에서 다음을 실행 pipe1했습니다 .pipe2./pgm1 < pipe1 > pipe2./pgm2 < pipe2 > pipe1
  3. pgm2 전에 pgm1을 실행하고 pgm1 전에 pgm2를 실행하여 위의 두 가지 를
    시도했습니다 . .fflush(stdout)printf()

누구든지 내가 무엇을 놓치고 있는지/또는 잘못되고 있는지/또는 이것이 가능한지 말해 줄 수 있습니까?

답변1

FIFO 및 파이프와 함께 작동하도록 할 수 있어야 합니다.

$ mkfifo fifo
$ ./pgm2 < fifo | ./pgm1 > fifo

프로그램 2의 입력은 fifo이고 파이프로 출력됩니다. 프로그램의 입력은 파이프이고 출력은 fifo입니다.

하지만 주의하세요. 이는 일반적으로 매우 까다롭고 프로세스 간의 "핑/퐁"이 완벽하지 않으면 교착 상태에 빠질 수 있습니다.

이 스택 오버플로 질문도 참조하세요.두 번째 프로세스의 stdout을 다시 첫 번째 프로세스의 stdin으로 리디렉션하는 방법은 무엇입니까?

답변2

다음 항목에 교착 상태가 발생했습니다 ./pgm1 < pipe1 > pipe2../pgm2 < pipe2 > pipe1

open("pipe1", O_RDONLY)실행하기 전에 쉘이 수행한 작업 은 pgm1다른 것이 open동일한 파이프에 쓰기를 수행할 때까지 차단됩니다. 완료될 때까지 다음 작업은 수행되지 않습니다 open("pipe2", O_WRONLY).

다른 하나도 마찬가지입니다. will 이 open("pipe2", O_RDONLY)차단되고 open("pipe2", O_WRONLY)다른 쉘이 작성자를 기다리고 있기 때문에 will이 완료되지 않기 때문에 pipe1교착 상태가 발생합니다.

혹시 쓰셨나요?

pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2

효과가 있었을 것입니다.

Linux에서는 다음과 같이 작성할 수도 있습니다.

{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :

관련 정보