2016-06-24 5 views
0

私は起動時に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プロセスをクローズする必要はありません。

データを正しく送受信できますか?

ありがとうございました。

答えて

0

は最後に解決策を見つける.....

空のバッファからデータを読み込もうとすると、 の場合は、Cからの入力を待ってハングします。

あり二つの問題、元のコードで解決すべきだ:

  1. printffflush(stdout)を追加します。

    出力がバッファされ、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

関連する問題