`ps`에 나열되지 않은 자체 $BASHPID가 있는 하위 쉘(하위 프로세스/하위 프로세스)

`ps`에 나열되지 않은 자체 $BASHPID가 있는 하위 쉘(하위 프로세스/하위 프로세스)

나는 다음 내용을 이해하지 못합니다:

mkfifo p;
$ (>p ps -f | >>p echo $BASHPID) &
[1] 983527
$ cat p
983529
   PID    PPID  C STIME TTY          TIME CMD
981815  165343  0 19:57 pts/27   00:00:00 bash
983527  981815  0 21:09 pts/27   00:00:00 bash    # <- child bash process `(...)`
983528  983527  0 21:09 pts/27   00:00:00 ps -f
983530  981815  0 21:09 pts/27   00:00:00 cat p

(...) &결과는 PID 983527의 하위 프로세스입니다. 배쉬 프로세스입니다.

ps -fPID 983528을 사용하여 하위 프로세스에서 실행됩니다. (...)파이프라인의 왼쪽 구성 요소 명령입니다 ...|....

echo $BASHPID보고서가 PID 983529로 실행 중입니다. 이는 파이프라인의 올바른 구성 요소여야 하며 ...|...bash 프로세스로 나열되어야 합니다.

마지막 설명이 맞나요? ps -f명령으로 나열된 마지막 프로세스를 볼 수 없는 이유는 무엇입니까 ?

답변1

>p ps -f | >>p echo $BASHPIDin은 bash동시에 두 개의 하위 프로세스를 시작하고 파이프를 통해 연결합니다. 두 프로세스 모두 p쓰기 전용 모드에서 fifo를 열어 시작합니다( O_APPEND두 번째 프로세스의 플래그를 사용하지만 파이프에는 영향을 미치지 않습니다).

fifo에는 아직 판독기가 없기 때문에 두 open()s 모두 거기에 정지되어 일부 프로세스가 읽기 모드에서 fifo를 열 때까지 기다립니다.

따라서 해당 시점에서 이미 두 프로세스의 시작점이 있습니다.

왼쪽에 있는 것은 여전히 ​​실행이 필요합니다. ps이는 /bin/ps실행 파일 찾기 및 로드, 동적 링커 로드, 라이브러리 로드 및 연결, 읽기 시작 /proc등을 의미하며 많은 작업이 필요합니다. 올바른 방법은 Expand 를 수행하고 $BASHPID그에 대해 분할+glob을 수행하고 echo내장 함수(내부 함수만 호출함)를 호출하면 함수는 확장을 작성하고 종료하는 것입니다.

실행 시 fifo가 열려 있는 cat p한 위 cat의 두 프로세스는 동시에 차단 해제됩니다. 올바른( echo)은 간단한 작업을 수행하고 ps로드가 완료되기 오래 전에 종료되었을 수 있으므로 ps찾을 수 없으며 /proc이것이 표시되지 않는 이유를 설명합니다.


1이고 그 죽음은 부모 프로세스에 의해 확인됩니다. 그렇지 않으면 프로세스는 여전히 좀비 프로세스로 나타납니다.

관련 정보