2015-12-22 3 views
2

Я пытаюсь создать канал FIFO между файлом-питоном и файлом C, но проблема в том, что при чтении на входе из файла C, getline блокирует до конца записи (в файле python) закрывается.Трубка FIFO считывается только после того, как конец записи закрыт

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, чтобы перейти "Command: Foo" как только он вводится через вход python. Однако данные считываются только тогда, когда вызывается fifo.close(), и он просто считывается сразу. Это не очень полезно, так как я хочу постоянный поток команд.

+1

Попробуйте 'fifo.flush()' после 'fifo.write (...)' – immibis

+0

Это именно то, что мне нужно! Спасибо! – arahoomam

ответ

2

Ваша проблема исходит из буфера. По умолчанию используется буфер блока FIFO. Таким образом, программа c не будет читать ничего, пока буфер записи fifo в python не будет заполнен. И есть два способа изменить это поведение:

  • указать режим буфера:

есть три режима буфера:

  1. блок буфера (по умолчанию)
  2. линейный буфер
  3. нет буфера вообще

Что вам нужно, так это буфер линии, поэтому используйте fifo = open("emg", "w", 1); вместо fifo = open("emg", "w");. номер 1 здесь вместо буфера строки. python doc

  • другой способ заставить флеш-буфер, после того, как использовать fifo.flush операции записи.
0

Как immibis говорит в комментариях, fifo.flush() решил мою проблему!