0

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 に準拠していません)。

4

2 に答える 2

2

パイプに使用できるリーダー プロセスとライター プロセスは 1 つだけです。POSIX では、パイプは単方向です。

代わりにソケット ファイルを使用してください。全二重であり、複数のプロセス通信が可能です。

于 2013-01-22T02:39:39.217 に答える
1

O_NONBLOCK を削除して試してください

。また、open 関数を 4 回呼び出すときは、O_WRONLY を使用する必要があります。

于 2013-06-19T07:34:24.927 に答える