2014-09-10 9 views
3

fork()로 여러 자식이 있고 부모와의 통신 방법이 "named pipes"인 경우 여러 개의 명명 된 파이프가 필요합니까? 한 명당 한 명? 아니면 하나를 만들어 부모가 읽게 할 수 있습니까?여러 개의 분기 된 자식에 대한 C - 명명 된 파이프

기본적으로 수행해야 할 작업이 있습니까? 여러 명의 어린이가 같은 이름의 파이프에 동시에 쓰는 경우 하나의 자식에서 전체 메시지를 읽는 데 문제가 발생할 수 있음을 이해합니다. 쓰기가 원자 적 (atomic)인지 확인하는 방법이 있습니까?

답변

4

단일 파이프로 여러 작성자를 가질 수 있습니다. 그러나 fork() 된 자식과 부모 사이에 통신이 있다고 말하면 파이프라는 이름의 이 필요하지 않을 수도 있습니다. 명명 된 파이프는 파일 시스템에서 볼 수 있으며 부모/자식이 아닌 프로세스 간의 통신에 사용될 수 있습니다.

원자성 정보 : PIPE_BUF (Linux의 경우 limits.h에서 512 바이트, 4096 바이트 미만)를 쓰면 쓰기가 어둡고 다른 작성자의 메시지가 혼합되지 않습니다. PIPE_BUF 이상을 쓰는 경우 원자가 적어지는 것에 의존하지 마십시오. 더 문제가 될 수

PIPE_BUF

POSIX.1-2001 says that write(2)s of less than PIPE_BUF bytes must be 
    atomic: the output data is written to the pipe as a contiguous 
    sequence. Writes of more than PIPE_BUF bytes may be nonatomic: the 
    kernel may interleave the data with data written by other processes. 
    POSIX.1-2001 requires PIPE_BUF to be at least 512 bytes. (On Linux, 
    PIPE_BUF is 4096 bytes.) 
+1

주 (아이들이 읽기, 부모 기록) 반대가 당신은 * * 찾을 수 있습니다 :

PIPE(7) manual page는 말한다 그 방향으로 데이터를 보내야하는 경우 여러 파이프가 답이됩니다. –

+0

@ JohnHascall, 맞아,하지만 문제가되는 것은 부모/자식 관계가 아니라 일반적으로 여러 독자가 있다고 생각합니다. 그러면 한 명의 독자 만 데이터를 가져올 수 있으며 모든 베팅은 어느 리더가 될지 꺼집니다. – Anton

+0

일반적인 유닉스 시스템에서 관찰 된'PIPE_BUF' 값의 표는 다음과 같습니다 : http://ar.to/notes/posix#pipe-buf –

0

하나의 파이프, 여러 개의 작성자 및 하나의 판독기 만 가질 수 있습니다. 그러나 올바르게 읽을 수 있으려면 어떤 종류의 데이터 구조가 필요합니다. 간단하게 할 수있는 것은 각각의 메시지 앞에 길이를 붙이는 것입니다. 작가가 무언가를 쓰고 싶다면 "hello"라는 문자열을 말하면 0x05와 문자열의 바이트를 보냅니다. 그런 다음 읽기가 균일합니다. 다음 바이트를 읽으려면 1 바이트를 읽습니다 (메시지에 대해 두 번 읽음). 파이프에 글을 쓰는 것은 당신이 너무 많이 쓰지 않는다면 원자가됩니다. 잘 모르겠지만 나는 PIPE_BUF 상수가 당신에게 원 자성을 보장하는 길이라고 생각한다.