![io 2개 프로그램을 "교차"하도록 리디렉션](https://rvso.com/image/50583/io%202%EA%B0%9C%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8%EC%9D%84%20%22%EA%B5%90%EC%B0%A8%22%ED%95%98%EB%8F%84%EB%A1%9D%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98.png)
stdin
두 프로그램 을 "교차"하는 방법은 무엇입니까 stdout
? 특히, 저는 2개의 프로그램 call 을 가지고 있는데 pgm1
, pgm2
그것들은 대화형 tic-tac-toe 게임입니다. 둘 다 표시하려는 위치를 나타내는 숫자(0~8)를 출력하고 사용자가 표시하려는 위치를 나타내는 다른 숫자(0~8)를 출력합니다. 둘의 차이점은 pgm1
먼저 움직이고 pgm2
두 번째로 움직이는 것입니다. 둘 다 대화형 사용자를 통해 잘 작동합니다. io 리디렉션을 사용하여 서로 대결할 수 있나요?
나는 다음을 헛되이 시도했습니다.
pgm2
별도의 터미널에서 열고 (입력을 기다립니다) pid를 찾습니다. 그런 다음pgm1
다른 터미널에서 실행하십시오../pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
- mkfifo를 사용하여 2개의 파이프를 만들고 두 개의 서로 다른 터미널에서 다음을 실행
pipe1
했습니다 .pipe2
./pgm1 < pipe1 > pipe2
./pgm2 < pipe2 > pipe1
- 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 | :