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.
yes ..forcing a flush will resolve the issue.
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:
there's three buffer mode:
What meet your needs here is the line buffer, so use
fifo = open("emg", "w", 1);
instead offifo = open("emg", "w");
will fix. number 1 here instead line buffer. python docfifo.flush
after the write operation.As immibis says in the comments, fifo.flush() solved my issue!