私は起動時にCサブプロセスを開き、クローズ時にCサブプロセスを終了させるPython GUIを持っています。Cサブプロセスからデータを読み込むときにPythonがハングする
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;
}
Iはfclose(stdout)
を追加した場合、私はPythonの終わりにCで印刷メッセージ"Caught signal XXX"
を捕まえることができました。
しかし、stdout
を閉じると、PIPEが壊れてしまい、データを送信できなくなりました。
fclose(stdout)
行がないと、プログラムは、outstr = fpi_c.stdout.read()
でハングします。
printf
(C言語)とfpi_c.stdin.flush()
(python)の後にfflush(stdout)
を試しましたが、まだハングします。
私がハングすると、Cプロセスを強制的にタスクマネージャーで閉じると、私はPythonの終わりでメッセージを捕まえることができました。
PythonはC.
の終了を待っているように思えるが、私はPythonのGUIが閉じられていない限りCプロセスをクローズする必要はありません。
データを正しく送受信できますか?
ありがとうございました。
お返事ありがとうございます。しかし、私はこの方法で試してみましたが、これはうまくいきませんでした。 – yorunosora