백그라운드 프로세스 교체

백그라운드 프로세스 교체

이 질문은 다음에서 비롯됩니다.https://mywiki.wooledge.org/ProcessSubstitution

mkfifo /var/tmp/fifo1
mkfifo /var/tmp/fifo2
sort list1 >/var/tmp/fifo1 &
sort list2 >/var/tmp/fifo2 &
diff /var/tmp/fifo1 /var/tmp/fifo2
rm /var/tmp/fifo1 /var/tmp/fifo2

명명된 파이프에 대해 내가 이해한 바에 따르면 다음이 작동한다고 생각합니다.

1-2행에서는 fifo1과 fifo2라는 두 개의 명명된 파이프를 만듭니다.

sort list1 > fifo1 &명명된 파이프에 쓰기를 시도 하므로 sort list2 > fifo2 &해당 파이프에서 데이터를 읽을 때까지 차단됩니다.

그런 다음 difffifo1 및 fifo2에서 다음 명령을 읽습니다. 따라서 3~4라인은 원활하게 실행됩니다. 다음으로 diff실행하여 출력을 터미널로 보냅니다.

마지막으로 명명된 파이프 fifo1 및 fifo2를 삭제합니다.

소식통은 모든 것이 diff <(sort list1) <(sort list2).

내 설명이 맞나요?

감사해요!

답변1

내 설명이 맞나요?

습관. sorts는 시작하기도 전에 차단됩니다( sorts를 실행하는 서브쉘은 s를 실행하려고 할 때 차단됩니다).열려 있는먼저 들어간 것이 먼저 나온 것입니다). FIFO의 반대쪽이 차단될 때까지만 차단됩니다.열려 있는필요없어읽다그것에서 아무것도 얻지 마십시오.

시도하면 mkfifo /tmp/fifo; true > /tmp/fifofifo true에 아무 것도 쓰려고 시도하지 않더라도 차단됩니다. 다른 쉘의 A는 true < /tmp/fifo시도하지 않고 잠금을 해제합니다.읽다아무것.

소식통은 모든 것이 diff <(sort list1) <(sort list2).

그렇지 않습니다. 어떤 이유로 diff fifo1 fifo2인수로 전달된 FIFO를 열기 전에 종료 되면 sort ... &누군가가 자비를 베풀고 수동으로 죽일 때까지 영원히 거기에 머물게 됩니다.

명명된 파이프를 사용하여 프로세스 교체가 실제로 달성될 수 있는지는 모르겠지만 FWIW bash는 s가 없는 플랫폼에서는 이를 쉽게 구현하지 않습니다. /dev/fdbash의 프로세스 교체는 버그가 있으므로 매우 주의해서 사용해야 합니다.

관련 정보