나는 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를 준수하지 않음).
정말 이상한 일을하지 않는 한, 이렇게하는 방법은 일반적으로 각 방향으로 하나씩 두 개의 파이프를 여는 것입니다. *와 * 동일한 프로세스에서 동일한 파이프를 읽는 것은 의미가 없습니다. 두 개의 파이프를 사용하면 프로세스 1이 먼저 읽고 두 번째 파이프에 씁니다. 프로세스 2가 두 번째 파이프를 읽고 첫 번째 파이프에 씁니다. – Amadan
@Amadan Set/ResetEvent WaitForSingle/MultipleObjects를 파이프를 사용하여 시뮬레이션 중이므로 하나의 파이프 일 필요가 있습니다. –