stdin
두 프로그램의 AND를 "교차"하는 방법은 무엇입니까 ? 특히 대화형 tic-tac-toe 게임인 tic-tac-toe 와 tic -tac-toe stdout
라는 두 가지 프로그램이 있습니다 . 그들은 모두 표시할 위치를 나타내는 숫자(0~8)를 출력하고 사용자가 표시하려는 위치를 나타내는 또 다른 숫자(0~8)를 기대합니다. 이 둘의 차이점은 먼저 움직이는 것과 나중에 움직이는 것입니다. 대화형 사용자에게는 모두 잘 작동합니다. io 리디렉션을 사용하여 서로 맞붙게 할 수 있나요?pgm1
pgm2
pgm1
pgm2
나는 다음과 같은 것들을 헛되이 시도했습니다.
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입니다.
하지만 주의하세요. 이는 일반적으로 매우 활동적이며 프로세스 간의 "핑/퐁"이 완벽하지 않으면 교착 상태로 이어질 수 있습니다.
이 스택 오버플로 질문도 참조하세요.두 번째 프로세스의 표준 출력을 첫 번째 프로세스의 표준 입력으로 다시 리디렉션하려면 어떻게 해야 합니까?
답변2
당신은 막다른 골목에 있습니다: ./pgm1 < pipe1 > pipe2
그리고./pgm2 < pipe2 > pipe1
open("pipe1", O_RDONLY)
이전에 쉘이 수행한 작업은 다른 것이 동일한 파이프에 pgm1
기록될 때까지 차단됩니다. open
이 작업이 완료될 때까지 추가 단계는 수행되지 않습니다 open("pipe2", O_WRONLY)
.
다른 쪽도 마찬가지입니다. 다른 쉘이 작성자를 기다리고 있기 때문에 open("pipe2", O_RDONLY)
차단되고 완료 되지 않으므로 교착 상태가 발생합니다.open("pipe2", O_WRONLY)
pipe1
당신은 쓴 적이 있나요?
pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2
작동합니다.
Linux에서는 다음과 같이 작성할 수도 있습니다.
{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :