0

「readmsg」という名前の実行可能ファイルを 1 つ作成します。そのソースコードは以下の通りです。は、シェルでselect()のみ実行する場合に機能します (の出力を確認できます)。readmsgtimeout

しかし、コマンドで FIFO ファイルを作成すると、シェルmknod /tmp/message pで実行されます。readmsg < /tmp/messageその結果、 にselect()何かを書かないと は戻れません/tmp/message。私の質問は、なぜtimeout出力を取得できないのですか?

「readmsg」のソースコード:

    #define STDIN 0
    fd_set fds;
    struct timeval tv;
    while (1) {
        FD_ZERO(&fds);
        FD_SET(STDIN, &fds);
        tv.tv_sec = 1;
        tv.tv_usec = 0;
        ret = select(STDIN + 1, &fds, NULL, NULL, &tv);
        if (ret > 0) {
            printf("works\n");
            if (FD_ISSET(STDIN, &fds)) {
                // read ...
            }
        } else if (ret == 0) {
            printf("timeout!!\n");
        } else {
            printf("interrupt\n");
        }
    }
4

1 に答える 1

1

ありがとう@マット。printf()close を追加した後main()も、出力はありません。readmsg実行時のプロセスIDすらありませんps。したがってreadmsg < /tmp/message、FIFO の書き込み準備が整う前に、プロセスがブロックされていることが証明されます。

エラーはありません。実際、readmsgリダイレクトされた FIFO ファイルからメッセージを読み取る場合、 はうまく機能します。

于 2013-01-13T12:36:49.503 に答える