创建 PIPE block

标签 c named-pipes

我使用以下代码创建了一个 PIPE。但是程序运行时出现了错误fd = open(FIFO, O_RDONLY);。阻塞现象。有人可以给我一些建议吗?非常感谢。

#include<errno.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdio.h>
#define FIFO "/tmp/test"

int main(int argc, char** argv)
{
    char buf_r[100];
    int fd;
    int nread;
    if((mkfifo(FIFO, O_CREAT) < 0) && (errno != EEXIST))
    {
            printf("can not create FIFO\n");
            exit(1);
    }

    printf("Prepare read data\n");
    fd = open(FIFO, O_RDONLY);
    if(fd == -1)
    {
            exit(1);
    }

    while(1)
    {
            if((nread = read(fd, buf_r, 100)) == -1)
            {
                    if(errno == EAGAIN) printf("No data\n");
            }

            if(buf_r[0]=='Q') break;

            buf_r[nread]=0;
            printf("data is:%s\n", buf_r);
            sleep(1);
    }

}

最佳答案

打开 FIFO 阻塞,直到“通信对端”也连接到 FIFO,以便成功建立管道。

顺便说一句,当创建 FIFO 失败时,您应该(最多)输出一个警告并继续 - 有可能 FIFO 已经存在并且可以重复使用。也许 /root/test/test 不是这个 FIFO 的最佳位置......

关于创建 PIPE block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23559238/

相关文章:

c - 将动态分配的数组传递给 const 时的非法指令 4

c - Open() with O_WRONLY 会阻塞,即使我 open() with O_RDONLY 在另一端

c - 函数 ‘mknod’ 的隐式声明,但我包含了 header

c# - 命名管道错误 40 : Visual Studio 2012 MySQL

c# - 使用命名管道 WCF 服务时出现通信对象错误

C - 求一个数的立方根

C 宽字符 - 如何使用它们?

c - C 中小于 1 的舍入值?

c - C 语言新手,正在努力使用 *、& 来引用对象

c - S_FIFO 未声明