Python FIFO管道仅在写入端关闭后读取

Python FIFO管道仅在写入端关闭后读取,python,c,pipe,fifo,Python,C,Pipe,Fifo,我试图在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

我试图在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()时才读入数据,并且一次读入所有数据。这并没有真正的帮助,因为我需要一个恒定的命令流

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

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

  • 指定缓冲区模式:
有三种缓冲模式:

  • 块缓冲区(默认)
  • 行缓冲区
  • 根本没有缓冲区
  • 这里满足您需要的是行缓冲区,因此使用
    fifo=open(“emg”,“w”,1)而不是
    fifo=open(“emg”、“w”)将修复。
    这里的数字是1,而不是行缓冲区

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

    • 是。强制刷新将解决问题。

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