1

FIFO を介してクライアントと通信するサーバーを構築しています。

これまでのところ、FIFO を作成し、メッセージが FIFO に到着したら新しいスレッドを実行し、スレッドからメッセージを出力することができました。

問題は、クライアントがパイプに何かを書き込むとすぐに、サーバーがメッセージを際限なく出力することです (パイプから a を読み取っていますwhile(1))。

私の質問は、read操作でパイプからメッセージを削除して、再度読み取られないようにするべきではありませんか? それが先入れ先出しのポイントではないでしょうか。それは私が手動でしなければならないことですか?

それが役立つ場合は、ここにも私のコードがあります: http://pastebin.com/Ag7vgrav
FIFOに書き込むために私がすることはただ:echo test > /home/ubuntu/work/my_fifo

4

1 に答える 1

5

からのリターン コードを確認する必要がありますread(2)。-1 が返された場合は、エラーが発生したため、すぐに読み取りを停止する必要があります。0 が返された場合、それは EOF です。これは、ライターが FIFO の最後を閉じたことを意味します。また、書き込みを停止し、FIFO の最後を閉じる必要があります。

複数のクライアントをサポートするには、新しいクライアントを受け入れるたびに FIFO を再度開く必要があります。

また、子スレッドを管理する方法には未定義の動作があります。whileのループの現在の反復が終了する前にスレッドが開始されるという保証はありません。そのmain()時点で、thread_argインスタンスは範囲外になります。データがまだ有効である間にスレッドが引き続きそのデータにアクセスできるようにするには、データをグローバル データにするか (子スレッドが 1 つしかない場合)、ヒープに動的に割り当てる必要があります。そのための通常のパターンは次のとおりです。

// Parent thread:
thread_arg *arg = malloc(sizeof(*arg));
...
pthread_create(..., &thread_proc, arg);

void *thread_proc(void *t_arg)
{
    thread_arg *arg = t_arg;

    // Thread code goes here
    ...
    free(arg);
    return exit_status;
}
于 2013-04-21T02:46:09.637 に答える