[問題] subprocess問題

作者: lionel20002 (遥かなソラ)   2016-06-24 09:50:10
手邊有一個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
作者: uranusjr (←這人是超級笨蛋)   2016-06-24 12:45:00
你送完要 flush 不然可能會被 OS 做 buffering
作者: alibuda174 (阿哩不達)   2016-06-24 14:56:00
不要用stdout.read,改用communicate試試
作者: lionel20002 (遥かなソラ)   2016-06-24 15:17:00
樓上的試過 目前找到一點端倪 等下自己回一篇
作者: Sunal (SSSSSSSSSSSSSSSSSSSSSSS)   2016-06-24 17:55:00
ZMQ很好用的

Links booklink

Contact Us: admin [ a t ] ucptt.com