FIFO를 읽기 전에는 왜 프로세스가 존재하지 않는 것 같나요?

FIFO를 읽기 전에는 왜 프로세스가 존재하지 않는 것 같나요?

간단한 Python 스크립트가 있습니다.

#!/usr/bin/python

import os, sys

sys.stderr.write('I am %s' % os.getpid())
sys.stderr.flush()

print "hello"

sys.stderr.write('I am done')

Bash에서 이 스크립트를 실행하고 표준 출력을 FIFO로 리디렉션하면 다음과 같습니다.

$ mkfifo fifo
$ /pyscript > fifo

이상한 점은 FIFO를 읽기 전에 다음과 같다는 것입니다.

  • "I am (PID)" 메시지가 표시되지 않습니다.

  • 사용된 스크립트를 볼 수 없습니다.ps -ef

  • 그리고 사용라소프, 그런 사람은 없는 것 같아요선입선출파일 오픈!

FIFO를 읽자마자 stderr에 쓰고 있는 두 개의 메시지가 즉시 나타납니다.

뭐가 문제 야?


배경: 저는 FIFO를 생성하고 여기에 "hello"를 쓰는 테스트를 작성 중입니다. 그런 다음 테스트를 실행하고 SUT를 기대합니다.아니요IE에서 읽습니다. 그냥 파일을 무시하세요. 나는 이것을 시도했지만 mkfifo test_fifo; /bin/echo hello > test_fifo &; run_the_test; killall echo놀랍게도 그 echo과정은 존재하지 않았습니다! 이런 테스트 후에는 어떻게 "정리"(제외)해야 합니까 rm test_fifo...?

답변1

쉘은 파일 리디렉션이 성공적으로 완료될 때까지 프로그램을 실행하지 않습니다. 이 명령은 pyscript > fifo쉘을 포크한 다음 열려고 시도합니다 . 이는 일부 프로세스가 이미 읽기 위해 fifo열려 있는 경우에만 성공합니다 . fifo그때까지 서브셸은 파이프라인 대기 상태에 있습니다.

$ (sleep 10;ps -l -t pts/0)&
[1] 2574
$ pyscript > fifo
F S   UID    PID   PPID WCHAN  TTY    CMD
0 S  1000   2554   2535 wait   pts/0  bash  //interactive shell
1 S  1000   2574   2554 wait   pts/0  bash  //fork of shell, parent of sleep and ps
1 S  1000   2576   2554 pipe_w pts/0  bash  //fork of shell, waiting to open fifo
0 R  1000   2577   2574 -      pts/0  ps

답변2

파이프나 FIFO의 양쪽 끝이 동시에 열려야 합니다. 프로세스가 작성되지 않은 파이프 또는 FIFO 파일에서 읽는 경우(아마도 모두 파일을 닫았거나 종료했기 때문일 수 있음) 읽기 시 파일 끝이 반환됩니다. 읽기 프로세스 없이 파이프나 FIFO에 쓰는 것은 오류 조건으로 간주되며 SIGPIPE 신호를 생성하고 신호가 처리되거나 차단되면 오류 코드 EPIPE와 함께 실패합니다.

http://www.gnu.org/software/libc/manual/html_node/Pipes-and-FIFOs.html

관련 정보