mkfifo가 LIFO처럼 동작하는 이유는 무엇입니까?

mkfifo가 LIFO처럼 동작하는 이유는 무엇입니까?

만약 내가한다면.

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_ONLYRD_WR

귀하의 .openecho two

따라서 이 시점에서 more /tmp/a아직 FIFO를 열지 않은 프로세스 두 개를 시작할 준비가 되었습니다. 둘 중 어느 것을 배열할지, 일단 more배열 open(RD_ONLY)되면 무작위입니다.

차단을 방지하려면 다음과 같이 하세요.

exec 3<>  /tmp/a

먼저 파이프를 잠금 해제한 다음 파이프가 가득 찰 때까지 차단하지 않고 명령을 실행합니다.

그러나 위의 내용은 Linux에 적용되지만 모든 Unix 또는 Unix 계열에 적용되는 것은 아닙니다. POSIX는 파이프가 읽기-쓰기 모드로 열릴 때의 동작을 지정하지 않습니다.

관련 정보