명명 된 파이프에 동시 쓰기를 보장하는 것은 무엇입니까?


32

예를 들어 다음과 같은 명명 된 파이프를 만들었습니다.

mknod myPipe p

그리고 일부 프로세스 (예 : 서버)에서 읽었습니다. 예를 들어, tail을 사용했습니다.

tail -f myPipe

여러 클라이언트 프로세스가 일부 메시지를 작성하는 경우 (예를 들어, echo "msg" >> myPipe다음과 같이 메시지가 인터리브 될 가능성이 있습니까?

 <beginning of message1><message2><ending of message1>

아니면 명명 된 파이프에 쓰는 과정이 원 자성입니까?

답변:


29

각 프로세스가 작성하는 양에 따라 다릅니다 (이 점에서 OS가 POSIX 호환이라고 가정). 보낸 사람 write():

파이프 또는 FIFO에 대한 쓰기 요청은 다음을 제외하고 일반 파일과 같은 방식으로 처리됩니다.
[...]

  • {PIPE_BUF} 바이트 이하의 쓰기 요청은 동일한 파이프에서 쓰기를 수행하는 다른 프로세스의 데이터와 인터리브되지 않아야합니다 . {PIPE_BUF} 바이트보다 큰 쓰기는 파일 상태 플래그의 O_NONBLOCK 플래그 설정 여부에 관계없이 임의의 경계에서 다른 프로세스에 의한 쓰기와 함께 데이터를 인터리브 할 수 있습니다.

또한 파이프 및 FIFO에 관한 이론적 섹션 에서 :

  • 원자 / 비 원자 : 한 작업에서 쓴 전체 양이 다른 프로세스의 데이터와 인터리브되지 않으면 쓰기는 원자 적입니다. 이 기능은 여러 명의 작성자가 단일 판독기로 데이터를 보내는 경우에 유용합니다. 응용 프로그램은 쓰기 요청이 원자 적으로 수행 될 수있는 크기를 알아야합니다. 이 최대 값은 {PIPE_BUF}입니다. 이 POSIX.1-2008 볼륨은 {PIPE_BUF} 바이트 이상에 대한 쓰기 요청이 원 자성인지 여부를 나타내지 않지만 {PIPE_BUF} 이하의 쓰기는 원 자성이어야합니다.

if 값 PIPE_BUF은 각 구현에 의해 정의되지만 최소값은 512 바이트입니다 (참조 limits.h). Linux에서는 4096 바이트입니다 (참조 pipe(7)).


5
그런데 PIPE_BUF는 512 이상으로 보장됩니다. 또한 프로세스가 실제로 한 줄의 호출로 각 줄을 쓰 도록 보장해야합니다 . 라인 버퍼링 ( setvbuf(stdout, NULL, _IOLBF,512))을 활성화 하면 저수준 기능을 사용하지 않고도이 작업을 수행 할 수 있습니다.
Random832

여기에 관찰의 테이블의 PIPE_BUF일반적인 유닉스 시스템에서 값 : ar.to/notes/posix#pipe-buf
아르토 Bendiken

소켓을 멀티플렉싱하는 방법을 이해하지 못하지만 명명 된 파이프는 할 수 없습니까 ?? 유닉스의 모든 것이 파일 일뿐입니까? lulz
Alexander Mills

@AlexanderMills : 귀하의 의견을 이해하지 못합니다
Mat

1
@AlexanderMills : 아니요, 최소값입니다
Mat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.