2016-06-24 2 views
0

У меня есть GUI python, который будет запускать подпроцесс C при запуске и убить подпроцесс C при закрытии.Python зависает при чтении данных с подпроцесса C

Сигнал, отправленный с python на C и с C на python, пойман правильно. Однако есть некоторые проблемы при получении данных на конце python.

Вот моя программа:

Python код:

fpi_c = subprocess.Popen(["./FPI_sig"],stdin=subprocess.PIPE,stdout=subprocess.PIPE) 

def handle_inform_from_c(signum, frame): 

    print("receved:", signum) 

    outstr = fpi_c.stdout.read() 

    print outstr 

signal.signal(signal.SIGUSR1, handle_inform_from_c) 

def gui_sense_and_save_fpi_2(): 

    fpi_c.stdin.write(str(123)+"\n") 

    os.kill(fpi_c.pid,signal.SIGUSR1) 

, где gui_sense_and_save_fpi_2 соединен с кнопкой. Когда кнопка нажата, данные и сигнал SIGUSR1 будут отправлены на подпроцесс C.

код C:

void signal_callback_handler2(int signum) 
{ 

    int gpid; 
    scanf("%d",&gpid); 

    printf("Caught signal %d\n",signum); 
    //fclose(stdout); 

    signal(SIGUSR1, signal_callback_handler2); 
    kill(getppid(),SIGUSR1); 

} 

int main() 
{ 

    signal(SIGUSR1, signal_callback_handler2); 
    while(1) 
    { 
     sleep(0.5); 
    } 
    return EXIT_SUCCESS; 
} 

Если добавить fclose(stdout), я мог поймать сообщение "Caught signal XXX" выведенного C в конце питона.

Однако закрытие stdout делает PIPE сломанным, и я больше не мог отправлять данные.

Без линии fclose(stdout) программа зависает на линии outstr = fpi_c.stdout.read().

Я пробовал fflush(stdout) после printf в C и fpi_c.stdin.flush() в python, но он все еще зависает.

При зависании, если я заставляю процесс C быть закрытым диспетчером задач, я мог поймать сообщение на конце python.

Похоже питона ждет окончания C.

Однако, я не хочу, чтобы закрыть процесс C, если GUI питон не будет закрыт.

Как я мог правильно отправлять и получать данные?

Спасибо.

ответ

0

Наконец найти решение ..... .

Если Python пытается прочитать данные из пустого буфера, в этом случае, он будет ожидать ввода из C и зависать.

Там уже две проблемы должны быть решены в исходном коде:

  1. Добавить fflush(stdout) после printf.

    В противном случае вывод будет буферизирован и фактически не записан, если не вызывается fflush(stdout).

  2. Python должен знать, сколько символов или сколько строк оно должно читать.

    Не использовать fpi_c.stdout.read(). Это будет ждать ввода C и зависает. Вместо этого используйте fpi_c.stdout.read(1), чтобы прочитать 1 символ или fpi_c.stdout.readline(), чтобы прочитать 1 строку.

Нечто подобное.

0

Вместо fclose выходной поток, используйте fflush промывать его так, чтобы содержимое в буфер записываются и родительский процесс может читать:

printf("Caught signal %d\n", signum); 
fflush(stdout); 
+0

Спасибо, что ответили. Однако я пробовал этот путь, и это не сработало. – yorunosora

Смежные вопросы