mkfifo を使用して名前付きパイプを作成し、リーダーとライターを開きました。次に、同じ fifo で 2 番目のリーダー/ライターを開きましたが、open は代わりに ENXIO を返します。
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でのみテストしました)。here で説明されているように、FIFO で複数のリーダー/ライターを開くことは完全に有効です。
これを使用して、別のプロジェクトで使用する必要がある WinAPI の OpenEvent 機能を複製します。
編集: Debian と Ubuntu でこれをテストしました - どちらも POSIX に準拠し、複数のライターを許可します (したがって、上記のコードは問題を示しません)。Cygwin の実装は壊れています (つまり、POSIX に準拠していません)。