만약 내가한다면.
mkfifo /tmp/a
echo 'one'>/tmp/a
다른 터미널에서 잠시
echo 'two'>/tmp/a
제3터미널에서
more /tmp/a
마지막 명령의 출력을 얻는 이유는 무엇입니까?
two
one
답변1
존재하다
echo 'one' > /tmp/a
쉘은 open(O_WRONLY)
파이프에서 작업을 수행한 다음 을 생성 echo
하고 실행합니다 write("one\n")
.
open
다른 프로세스가 파이프를 열 때까지 차단됩니다 .RD_ONLY
RD_WR
귀하의 .open
echo two
따라서 이 시점에서 more /tmp/a
아직 FIFO를 열지 않은 프로세스 두 개를 시작할 준비가 되었습니다. 둘 중 어느 것을 배열할지, 일단 more
배열 open(RD_ONLY)
되면 무작위입니다.
차단을 방지하려면 다음과 같이 하세요.
exec 3<> /tmp/a
먼저 파이프를 잠금 해제한 다음 파이프가 가득 찰 때까지 차단하지 않고 명령을 실행합니다.
그러나 위의 내용은 Linux에 적용되지만 모든 Unix 또는 Unix 계열에 적용되는 것은 아닙니다. POSIX는 파이프가 읽기-쓰기 모드로 열릴 때의 동작을 지정하지 않습니다.