Re: [問題] subprocess問題

作者: lionel20002 (遥かなソラ)   2016-06-24 15:34:44
又搞了一個上午 好像找到問題在哪了
主要問題是python端不能讀到空的buffer,
一讀到空的buffer python就會一直等C的輸入 然後就等到死
換句話說 python需要知道現在buffer裡面有多少東西是我要讀出來的
直接call read()讀整份文件 沒有指定要讀幾個char或是讀幾行的話
就會把目前的東西都讀出來以後一直等C再input
所以這時候用工作管理員把C幹掉python就可以解除等待繼續運作 就可以看到資料print出來
整理一下 這個程式主要有兩個問題
1. C端沒有fflush,printf完buffer住沒有寫出去,python讀不到東西就一直等
2. python端沒有指定要讀多少資料,於是把目前資料讀出以後開始等C輸入
兩個問題都解決資料就能正常收送了
※ 引述《lionel20002 (遥かなソラ)》之銘言:
: 手邊有一個python的GUI,另外開了一個C的subprocess
: 目前signal從python丟到C或是C丟到python都正常收到
: 但是資料的收送有些問題
: Python Code:
: 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 code:
: 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),python端就可以收到C print出來的"Caught signal XXX"
: 但是因為stdout close了 再傳資料就會顯示PIPE壞掉無法傳
: 沒有fclose(stdout)會當在python的outstr = fpi_c.stdout.read()
: 感覺好像是python一直在等C執行結束才會收值 但是C只會一直等signal不會自己結束
: 所以就卡死?
: 或者是subprocess.PIPE的管理根本就不對?
: 昨天一整天都在找資料跟嘗試 還是無法搞定
: 怎樣才能讓資料正常收送 懇請高手幫忙m(_ _)m

Links booklink

Contact Us: admin [ a t ] ucptt.com