FIFO pipe only reads after write end has closed

2020-03-30 01:28发布

问题:

I'm trying to create a FIFO pipe between a python file and C file, but the issue is that when reading in the input from the C file, getline blocks until the writer end (in the python file) closes.

C file:

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 file:

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

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

fifo.close()

When i run both, I want the output from the C file to go "Command: foo" as soon as it is entered through the python input. However, data is only read in when fifo.close() is called, and it is just read in all at once. This is not really helpful since I want a constant stream of commands.

回答1:

Your problem comes from the buffer. FIFO use block buffer by default. So the c program won't read anything until the write buffer of the fifo in python was full. And there's two way to change this behaviour:

  • specify the buffer mode:

there's three buffer mode:

  1. block buffer(default)
  2. line buffer
  3. no buffer at all

What meet your needs here is the line buffer, so use fifo = open("emg", "w", 1); instead of fifo = open("emg", "w"); will fix. number 1 here instead line buffer. python doc

  • another method is force flush the buffer, use fifo.flush after the write operation.


回答2:

yes ..forcing a flush will resolve the issue.



回答3:

As immibis says in the comments, fifo.flush() solved my issue!



标签: python c pipe fifo