【问题标题】:FIFO pipe only reads after write end has closedFIFO 管道仅在写端关闭后读取
【发布时间】:2015-12-22 08:40:40
【问题描述】:

我正在尝试在 python 文件和 C 文件之间创建一个 FIFO 管道,但问题是当从 C 文件中读取输入时,getline 会阻塞,直到编写器结束(在 python 文件中)关闭。

C 文件:

char fifo_emg[] = "emg";
mkfifo(fifo_emg, S_IRWXU);

int fd_emg = open(fifo_emg, O_RDONLY);
FILE* fp = fdopen(fd_emg, "r");

char *line = NULL;
size_t len = 0;
ssize_t _read;
printf("Both ends open. Reading commands...\n");
while ((_read = getline(&line, &len, fp)) != -1) {
    printf("Comamnd: %s", line);
}   

Python 文件:

fifo = open("emg", "w");

while 1:
    line = raw_input("ENTER COMMAND: ")
    if line[0] == '!':
        break
    else:
        fifo.write(line + '\n')

fifo.close()

当我同时运行两者时,我想要 C 文件的输出 “命令:foo” 一旦通过python输入输入。 但是,只有在调用 fifo.close() 时才会读入数据,并且只是一次读入所有数据。这并没有真正的帮助,因为我想要一个恒定的命令流。

【问题讨论】:

  • fifo.write(...)之后尝试fifo.flush()
  • 这正是我所需要的!非常感谢!

标签: python c pipe fifo


【解决方案1】:

您的问题来自缓冲区。 FIFO 默认使用块缓冲区。所以在python中fifo的写缓冲区满之前,c程序不会读取任何内容。有两种方法可以改变这种行为:

  • 指定缓冲模式:

共有三种缓冲模式:

  1. 块缓冲区(默认)
  2. 行缓冲区
  3. 根本没有缓冲区

这里满足您的需求的是行缓冲区,因此使用fifo = open("emg", "w", 1); 而不是fifo = open("emg", "w"); 将修复。 这里的数字 1 而不是行缓冲区。 python doc

  • 另一种方法是强制刷新缓冲区,在写入操作后使用fifo.flush

【讨论】:

    【解决方案2】:

    是的..强制刷新将解决问题。

    【讨论】:

      【解决方案3】:

      正如 immibis 在 cmets 中所说,fifo.flush() 解决了我的问题!

      【讨论】: