У меня есть 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 питон не будет закрыт.
Как я мог правильно отправлять и получать данные?
Спасибо.
Спасибо, что ответили. Однако я пробовал этот путь, и это не сработало. – yorunosora