2013-01-22 7 views
0

나는 mkfifo를 사용하여 명명 된 파이프를 만들고 그것에 리더와 라이터를 열었습니다. 그런 다음 동일한 FIFO에서 두 번째 리더/라이터를 열었지만 열린 대신 ENXIO를 반환합니다.FIFO상의 다중 리더/라이터 (명명 된 파이프)

std::string n = "/tmp/test"; 
int err; 
err = mkfifo(n.c_str(), 0666); 
if (err == -1) 
    return NULL; 

int pipefd[2]; 
pipefd[0] = open(n.c_str(), O_RDONLY | O_NONBLOCK); 
pipefd[1] = open(n.c_str(), O_WRONLY | O_NONBLOCK); 
open(n.c_str(), O_RDONLY | O_NONBLOCK); // fails - ENXIO 
open(n.c_str(), O_WDONLY | O_NONBLOCK); // fails - ENXIO 

여러 번 열 수 있도록 파이프를 열 때 설정할 필요가있는 특정 플래그가 있습니까? 나는 문서를 읽었지만, 왜 위와 같이 실패해야하는지에 대한 설명을 찾지 못했다. (필자는 지금까지 Cygwin에서만 테스트 해왔다.) described here으로, fifo에서 여러 독자/작성자를 열 수 있습니다.

별도의 프로젝트에서 사용해야하는 WinAPI의 OpenEvent 기능을 복제 할 때이 기능을 사용합니다.

EDIT : Debian 및 Ubuntu에서 테스트되었습니다. POSIX를 준수하고 여러 작성자를 허용합니다 (따라서 위 코드는 아무런 문제가 없습니다). Cygwin의 구현이 깨졌습니다 (즉, POSIX를 준수하지 않음).

+2

정말 이상한 일을하지 않는 한, 이렇게하는 방법은 일반적으로 각 방향으로 하나씩 두 개의 파이프를 여는 것입니다. *와 * 동일한 프로세스에서 동일한 파이프를 읽는 것은 의미가 없습니다. 두 개의 파이프를 사용하면 프로세스 1이 먼저 읽고 두 번째 파이프에 씁니다. 프로세스 2가 두 번째 파이프를 읽고 첫 번째 파이프에 씁니다. – Amadan

+0

@Amadan Set/ResetEvent WaitForSingle/MultipleObjects를 파이프를 사용하여 시뮬레이션 중이므로 하나의 파이프 일 필요가 있습니다. –

답변

1

파이프에 대해 판독기 프로세스 및 작성기 프로세스가 하나만 가능합니다. POSIX에서는 파이프가 단방향입니다.

소켓 파일을 대신 사용하십시오. 그것은 전이중 (full-duplex)이며 다중 프로세스 통신을 허용합니다.

+0

나는 그것이 실현 가능하다고 생각하지 않는다. 명명 된 소켓과 같은 것은 없습니다. –

+0

"UNIX 도메인 소켓"이라고도하는 로컬 도메인 소켓을 의미합니다. – clover

+0

unix.7 맨 페이지 – clover

0

O_NONBLOCK을 제거한 상태에서 시도하십시오.

네 번째로 열 함수를 호출하면 O_WRONLY 여야합니다.