1

Linuxで単純なデーモンを作成しようとしています。これにより、FIFOが作成され、FIFOに書き込まれたものがすべて収集され、後でそのデータがファイルに書き込まれます。

私の期待は、デーモンがFIFOを作成したら、「echo text>/myfifo」を繰り返し実行できることです。完了したら、「echo quit> / myfifo」を実行すると、プログラムが終了し、すべてのデータがディスクに書き込まれます。

現在、FIFOにさらにデータがあるかどうかを知るためにpoll()を使用しています。これは、最初にデータをFIFOにエコーするまでは正常に機能します。データは正常にエコーされますが、その後、ポーリングは継続的にSIGHUPを返します。

各プロセスがFIFOに書き込んだ後、FIFOをリセット(または閉じて再度開く)する必要がありますか?

私のコードの擬似コードは次のようになります。

ret = fifo(my_fifo, mode);
fd = open(my_fifo, O_RDONLY | O_NONBLOCK);

polling.fd = fd;
polling.events = POLLIN | POLLPRI;

do {
    ret = poll(&polling, 1, -1);
    amt = read(fd, buf, bufsize);
    // do stuff
} while (!done);
4

1 に答える 1

2

FIFOを再度開く必要があると思います。FIFOを監視するプログラムがあり、監視ループは次のとおりです。

/* Implement monitor mode */
void sql_monitor(char *fifo)
{
    if (chk_fifo(fifo) != 0)
        cmd_error(E_NOTFIFO, fifo);

    /* Monitor -- device is assumed to be a FIFO */
    while (1)
    {
        ctxt_newcontext();
        if (ctxt_setinput(fifo) != 0)
            sql_exit(1);
        sql_file();
        ctxt_endcontext();
    }
}

このctxt_newcontext()関数は、現在のI/O状態を隠します。このctxt_setinput()関数は、入力ファイルを指定されたファイル(この場合はFIFO)に設定します。このsql_file()関数は、ファイル(FIFO)から最後に到達するまで読み取ります。つまり、ファイルは閉じられます。ctxt_endcontext()何をするかを元に戻しますctxt_newcontext()。このプロセスが繰り返されます...このコードは1990年頃から存在しています。

したがって、はいecho、ファイルの終わりを読み取った後( FIFOへの書き込みが終了するなどの各プロセスの後)、FIFOを閉じて再度開く必要があります。

(データがないときにプロセスが実行する他の何かがない限り、FIFOをポーリングする必要がないことにも注意してください。read()呼び出しは、データが存在するまで待機してから戻ります。)

于 2010-07-11T03:29:08.527 に答える