1
gcc (GCC) 4.7.2
c89

パイプ mkfifo を使用しています。読み手と書き手がいます。

ファイルに何かがあるまでリーダーをブロックしてほしい。

非ブロック モード用の O_NONBLOCK を設定できるフラグがあります。したがって、デフォルトでは、読み取り時にブロックする必要があります。

ファイルへの書き込み

int main(void)
{
    int fd;
    const char *pipe_file = "../../pipe_file/file";
    const char *pipe_msg = "PIPE Message";

    LOG_INFO("Start writer");

    /* Create the FIFO named pipe with read/write permissions */
    mkfifo(pipe_file, 0666);

    /* Write to the pipe */
    fd = open(pipe_file, O_WRONLY);
    write(fd, pipe_msg, strlen(pipe_msg) + 1);

    LOG_INFO("Terminate writer");

    return 0;
}

ファイルからの読み取り

int main(void)
{
    int fd = -1;
    const char *pipe_file = "../../pipe_file/file";
#define BUF_SIZE 1024
    char rd_buffer[BUF_SIZE];

    LOG_INFO("Start reader");

    fd = open(pipe_file, O_RDONLY);

    do {
        memset(rd_buffer, 0, sizeof(rd_buffer));
    /* I WANT IT TO BLOCK HERE, UNTIL THE FILE IS WRITTEN AGAIN */
        read(fd, rd_buffer, sizeof(rd_buffer));
        LOG_INFO("Contents of buffer [ %s ]", rd_buffer);
    /* NO NEED TO SLEEP AS THE FILE WILL DELAY WHEN BLOCKING, I THINK */
    } while(1);

    /* We're done clean up */
    close(fd);
    unlink(pipe_file);

    LOG_INFO("Terminate reader");

    return 0;
}
4

1 に答える 1

5

fiforead()のもう一方の端が書き込みモードで開いていない場合は、すぐに戻ります。最初に Write プログラムを実行してみてください。

詳細については、ここをクリックしてください

于 2013-07-17T11:25:45.543 に答える