나는 다음 내용을 이해하지 못합니다:
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 -f
PID 983528을 사용하여 하위 프로세스에서 실행됩니다. (...)
파이프라인의 왼쪽 구성 요소 명령입니다 ...|...
.
echo $BASHPID
보고서가 PID 983529로 실행 중입니다. 이는 파이프라인의 올바른 구성 요소여야 하며 ...|...
bash 프로세스로 나열되어야 합니다.
마지막 설명이 맞나요? ps -f
명령으로 나열된 마지막 프로세스를 볼 수 없는 이유는 무엇입니까 ?
답변1
>p ps -f | >>p echo $BASHPID
in은 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이고 그 죽음은 부모 프로세스에 의해 확인됩니다. 그렇지 않으면 프로세스는 여전히 좀비 프로세스로 나타납니다.