두 프로그램 사이에 단방향 파이프를 설정하는 방법( stdout
첫 번째 프로그램과 stdin
두 번째 프로그램 바인딩) 은 누구나 알고 있습니다 first | second
.
하지만 양방향 파이프라인, 즉 두 프로그램의 교차 stdin
바인딩을 만드는 방법은 무엇입니까 stdout
? 쉘에서 쉽게 할 수 있는 방법이 있나요?
답변1
음, 명명된 파이프( )를 사용하는 것은 꽤 "간단"합니다 mkfifo
. 프로그램이 이를 위해 설계되지 않으면 교착 상태가 발생할 가능성이 높기 때문에 쉽게 따옴표로 묶었습니다.
mkfifo fifo0 fifo1
( prog1 > fifo0 < fifo1 ) &
( prog2 > fifo1 < fifo0 ) &
( exec 30<fifo0 31<fifo1 ) # write can't open until there is a reader
# and vice versa if we did it the other way
이제 표준 출력에 쓰는 작업에는 일반적으로 버퍼링이 포함됩니다. 예를 들어, 두 프로그램이 모두 다음과 같은 경우:
#!/usr/bin/perl
use 5.010;
say 1;
print while (<>);
무한 루프가 예상됩니다. 그러나 오히려 양측은 교착상태에 빠지게 된다. $| = 1
출력 버퍼링을 끄려면 추가(또는 이에 상응하는 것)가 필요합니다 . 교착상태의 원인은둘 다프로그램이 표준 입력에서 무언가를 기다리고 있지만 다른 프로그램의 표준 출력 버퍼에 있고 아직 파이프에 기록되지 않았기 때문에 이를 볼 수 없습니다.
고쳐 쓰다: Stéphane Charzelas와 Joost의 제안을 결합합니다.
mkfifo fifo0 fifo1
prog1 > fifo0 < fifo1 &
prog2 < fifo0 > fifo1
동일한 작업을 수행하며 더 짧고 휴대성이 뛰어납니다.
답변2
시스템에서 파이프가 양방향인 경우(적어도 Solaris 11 및 일부 BSD에서는 가능하지만 Linux에서는 불가능):
cmd1 <&1 | cmd2 >&0
하지만 교착상태에 주의하세요.
또한 일부 시스템의 일부 ksh93 버전은 파이프( |
) 를 사용합니다.소켓 쌍. 소켓 쌍은 양방향이지만 ksh93은 명시적으로 반대 방향을 닫으므로 pipe(2)
파이프(시스템 호출에 의해 생성됨)가 양방향인 시스템에서도 위 명령은 이러한 ksh93에서 작동하지 않습니다.
답변3
이것이 당신이 원하는 것인지 확실하지 않습니다.
nc -l -p 8096 -c second &
nc -c first 127.0.0.1 8096 &
먼저 포트 8096에서 청취 소켓을 열고 연결이 설정되면 프로그램이 생성되어 스트림 출력 및 스트림 입력 으로 second
스트리밍됩니다 .stdin
stdout
nc
그런 다음 수신 대기 포트에 연결하고 프로그램을 스트림 입력 및 스트림 출력 first
으로 생성하는 두 번째 프로그램을 시작합니다.stdout
stdin
이는 파이프를 사용하여 정확하게 수행되지는 않지만 필요한 작업을 수행하는 것 같습니다.
이는 네트워크를 사용하므로 두 대의 원격 컴퓨터에서 수행할 수 있습니다. 이는 웹 서버( second
)와 웹 브라우저( )가 작동하는 방식과 거의 같습니다 first
.
답변4
당신은 그것을 사용할 수 있습니다파이프라인 액츄에이터:
$ pipexec -- '[A' cmd1 ] '[B' cmd2 ] '{A:1>B:0}' '{B:1>A:0}'