5

この方法で非ブロッキング書き込みを実行できる FIFO を作成しました。

// others, searching for a non-blocking FIFO-writer may copy this ;-)
mkfifo("/tmp/myfifo", S_IRWXU);
int fifo_fd = open("/tmp/myfifo", O_RDWR);
fcntl(fifo_fd, F_SETFL, fcntl(fifo_fd, F_GETFL) | O_NONBLOCK);

// and then in a loop:
LOGI("Writing into fifo.");
if (write(fifo_fd, data, count) < 0) {
    LOGE("Failed to write into fifo: %s", strerror(errno));
}

ノンブロッキング書き込みは完璧に機能します。

反対側では、FIFO を読み取り用に開き、同じ fcntl() を実行して read() をノンブロッキングにします。

ここで、書き込み側でいくつかの (CPU を集中的に使用する) 計算を行いたいと思いますが、リーダーが接続されている場合のみです。

そのため、FIFO が別の場所で読み取り用に開かれているかどうかを検出するために、書き込み側で方法を見つける必要があります。

これを達成する方法を知っている人はいますか?

4

1 に答える 1

0

ここで、書き込み側でいくつかの (CPU を集中的に使用する) 計算を行いたいと思いますが、リーダーが接続されている場合のみです。

そのためには、単純にソケットを作成し、コンシューマーがそれに接続すると、いくつかの作業を行って書き戻すことができます。
しかし、より良い解決策は、消費者が接続する (または FIFO を開く) 前に計算結果を準備することだと思います。ただし、作業が消費されていない場合は、プロデューサーを動作させたくありません。したがって、N を定義し、使用できるようにしておく意思のある作業結果の数を定義し、プロデューサー (または複数のプロデューサー) が作業して、サイズ N のキューがいっぱいになるまで結果を保存できるようにします。
これをスレッドで実装すると、1 つのスレッドが接続をリッスンし、キューからポップしてコンシューマーに書き込み、1 つ以上のプロデューサー スレッドが動作してキューにプッシュします。または、 POSIX メッセージ キュー
を使用できます。頭痛の種を避けるために。サイズ N のキューを作成すると、独立したプロデューサー (異なる言語で記述された複数のプロセス) がキューがいっぱいになるまでプッシュでき、複数の独立したコンシューマーがそこからポップします。

于 2013-01-29T13:09:27.120 に答える