c - 使用 mkfifo 阻塞读取直到写入

标签 c file-io mkfifo

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;
}

最佳答案

如果 fifo 的另一端在写入模式下未打开,您的 read() 将立即返回。尝试先运行您的 Write 程序并查看。

更多信息请点击here

关于c - 使用 mkfifo 阻塞读取直到写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17698338/

相关文章:

C - 从数组(结构数组)中删除除平均成绩最高的 10 名学生之外的学生

php - 如何导出动态生成的临时 csv 文件?

java - 是否有任何用于二进制文件解析的 Java 框架?

linux - 使用poll()在命名管道上使用O_RDWR

C - 跟踪网络事件 - Lib pcap

c - 简单链表 - 无法访问节点

linux - 如何在linux下使用持久命名管道?

c - 命名管道未按预期工作。同一条消息被一遍又一遍地阅读

c - 区分C中字符串(字符数组)的十六进制值

c++ - 使用 Abaqus ODB C++ API 访问部件