FIFO通道读取不正确

问题描述 投票:0回答:1

我有2个不相关的过程。第一个创建FIFO通道并将数据写入其中。

testcomp:

int main(int argc, char *argv[])
{
    int f1;
    char *send_buf = "Hello";
    char recv_buf[128] = {0};

    if (mkfifo("mk.fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1 && errno != EEXIST)
        error(0, errno, "mkfifo() error");

    f1 = open("mk.fifo", O_RDWR);
    perror("Opening ");

    printf("Sending string '%s'...\n", send_buf);
    write(f1, send_buf, strlen(send_buf));
    perror("Writing ");

    close(f1);
    return 0;
}

第二个过程应该从先前创建的通道读取数据。

test2comp:

int main(int argc, char *argv[])
{
    int f2;
    char recv_buf[128] = {0};

    f2 = open("mk.fifo", O_RDONLY|O_NONBLOCK);
    perror("Opening ");

    read(f2, recv_buf, sizeof(recv_buf));
    perror("Reading ");

    printf("Received string '%s'\n", recv_buf);

    close(f2);
    return 0;
}

问题是读取的数据为空。可能是什么原因?

控制台输出:

enter image description here

c linux named-pipes fifo
1个回答
1
投票

FIFO只是一个命名管道。

它必须在两端都打开[,以便进行通信。例如,您当地的man page应该说类似

内核为每个特殊的FIFO维护一个管道对象由至少一个进程打开的文件。 FIFO必须打开在两端(读取和写入)可以传递数据之前。通常,打开FIFO块,直到另一端也打开。

您所做的是:

    创建FIFO索引节点
  1. 打开它进行写入,隐式创建与该inode关联的管道
  2. 即使尚未读取任何内容,也要将其写入管道缓冲区
  3. 再次关闭,破坏管道
  4. 打开一个用于读取的新管道,该管道与相同(当前未使用)的inode关联
  5. 那里什么也没有,因为它是新管道
  • 通常,我希望作者在打开fifo时阻塞,直到出现读者为止-我不确定为什么没有发生。通过将其设置为非阻塞,您已为阅读器明确禁用了此行为。
  • © www.soinside.com 2019 - 2024. All rights reserved.