고려하다:
mkfifo /tmp/out1
mkfifo /tmp/in2
cat /tmp/out1 > /tmp/in2 &
내가 달릴 때
ps
이는 리소스 섹션 bash
에 표시된 것과 같습니다 CMD
.
왜?
답변1
ps
목록세게 때리다/tmp/in2
명령을 생성하기 cat
전에 fifo를 열려고 시도하는 bash 프로세스가 차단되었기 때문에 실행 중인 프로세스로 인식됩니다 . bash
이는 리디렉션( ) 처리를 담당하므로 나중에 시스템 호출을 사용하여 명령의 파일 설명자를 으로 변경할 수 있도록 > /tmp/in2
먼저 열어야 합니다 . 불행하게도 이 경우 호출이 차단됩니다./tmp/in2
dup2
STDOUT
cat
/tmp/in2
open
strace에서 명령을 실행하려면 다음을 수행하십시오.
strace -f bash -c "cat /tmp/out1 > /tmp/in2"
다음 위치에서 중지되는 것을 볼 수 있습니다.
[pid 18457] open("/tmp/in2", O_WRONLY|O_CREAT|O_TRUNC, 0666
다른 프로세스가 읽기 위해 파일을 열 때까지 차단됩니다. ~에 따르면선입선출(7)매뉴얼 페이지:
커널은 하나 이상의 프로세스에서 연 각 FIFO 특수 파일에 대한 파이프 개체를 유지 관리합니다. 데이터를 전송하려면 먼저 FIFO(읽기 및 쓰기)의 양쪽을 열어야 합니다. 일반적으로 다른 쪽 끝도 열릴 때까지 FIFO 블록을 엽니다.
프로세스는 비차단 모드에서 FIFO를 열 수 있습니다. 이 경우 읽기 전용으로 여는 것은 누군가가 아직 쓰기 측에서 열지 않았더라도 성공할 것이며, 쓰기 전용으로 여는 것은 상대방이 이미 열려 있지 않으면 ENXIO(해당 장치나 주소 없음)로 실패할 것입니다.
먼저 읽기를 켜면 /tmp/in2
(예: 최종 cat 명령 앞에 추가하는 경우 ) 프로세스 트리에 cat /tmp/in2 &
최종 명령이 표시됩니다 .cat