GNU C 라이브러리 매뉴얼에는 파이프 읽기와 쓰기가 모두 가능하다고 간략하게 언급되어 있습니다.원자
파이프 데이터 읽기 또는 쓰기는 작성된 데이터 크기가 PIPE_BUF보다 크지 않은 경우 원자성입니다.
그러나 Linux의 매뉴얼 페이지는 다음과 같습니다.남성용 튜브 7개, 읽기가 원자적이라는 점은 언급하지 마세요.남자 2 읽다읽기가 신호에 의해 중단된 경우 읽기가 요청한 것보다 적은 양을 반환할 수 있음을 명확히 합니다.
그렇다면 길이가 읽기보다 짧은 파이프에 대한 읽기 호출은 PIPE_BUF
Linux에서 실제로 원자적입니까?
특히, 파이프의 단일 기록기가 항상 12바이트 블록을 쓰고 해당 파이프에 해당 파이프에서 12바이트를 읽는 2명의 동시 판독기가 있는 경우 해당 판독기는 정확히 12바이트를 읽거나 EAGAIN
다음과 유사한 오류가 발생합니다. 부분 읽기가 가능한가요?
PIPE_BUF/12
또한 작성자가 12바이트 청크로 작성했지만 동시 판독기가 최대 청크를 한 번에 읽으려고 시도하는 경우는 어떻게 되나요? 성공적인 읽기는 항상 12바이트의 정확한 승수를 반환합니까, 아니면 원하는 수의 바이트가 반환될 수 있습니까?
답변1
소스 코드를 보면 Linux 커널에서 pipe_read
in의 구현이 source/fs/pipe.c
크게 변경되었지만 in의 코드를 빠르게 읽어 보면2.0.40,2.4.37,2.6.32,3.11그리고4.9read
, 쓰기 크기 가 있거나 차단될 때마다승그리고 사이즈 판독아르 자형그리고아르 자형>승그럼 read
적어도 돌아올 거야승바이트. 따라서 고정된 크기의 블록(보다 작은 크기 PIPE_BUF
)이 있고 항상 동일한 크기의 데이터를 읽는 경우 항상 전체 블록을 읽는 것이 효과적으로 보장됩니다.
반면에 가변 크기 청크가 있는 경우에는 그러한 보장이 없습니다. 쓰기 측에서만 원자성이 보장됩니다. 그보다 적은 양의 쓰기는 PIPE_BUF
다른 작성자에 의해 잘리지 않습니다. 그러나 판독기 측에서는 10바이트를 쓴 다음 20바이트를 쓰고 15바이트를 읽으려고 하면 첫 번째 쓰기와 두 번째 쓰기가 모두 이루어집니다. 입력된 처음 5바이트가 기록됩니다. 호출 read
은 차단되어야 하거나 출력 버퍼가 가득 찰 때까지 데이터 읽기를 중지하지 않습니다.
데이터를 청크로 전송하려면 다음을 사용하십시오.데이터그램 소켓파이프 대신.