명명된 파이프에 대한 동시 쓰기는 어떻게 보장됩니까?

명명된 파이프에 대한 동시 쓰기는 어떻게 보장됩니까?

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

mknod myPipe p

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

tail -f myPipe

여러 클라이언트 프로세스가 일부 메시지를 쓰는 경우 echo "msg" >> myPipe메시지가 인터리브될 수 있습니까? (예: 다음과 같습니다.)

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

아니면 명명된 파이프에 쓰는 프로세스가 원자적입니까?

답변1

이는 각 프로세스가 쓰는 양에 따라 다릅니다(운영 체제가 이와 관련하여 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)).

관련 정보