"ps" 명령을 사용할 때 "cat /tmp/out1 > /tmp/in2 &"가 "bash"로 나타나는 이유는 무엇입니까?

"ps" 명령을 사용할 때 "cat /tmp/out1 > /tmp/in2 &"가 "bash"로 나타나는 이유는 무엇입니까?

고려하다:

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/in2dup2STDOUTcat/tmp/in2open

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

관련 정보