2013-07-10 63 views
0

我有一個函數,可以在一定的時間間隔內返回我的Wifi信號的強度。Popen導致程序凍結

FILE *sig; 
int sigstr=0, max; 
sig = popen("iwconfig wlan0 | awk '/Link/ {print $2}'","r"); 
while(fgetc(sig)!='='); 
fscanf(sig,"%d/%d", &sigstr, &max); 
pclose(sig); 
return(((sigstr*4)+(max/2))/max); 

我遇到的問題是我的程序在一段時間後凍結,取決於獲取Wifi信號的時間間隔。間隔越短,程序越快凍結。現在糾正我,如果我錯了,但這似乎是一個記憶問題。隨着時間的推移,某些項目沒有正確地從堆棧中移除或釋放,導致內存被填滿並最終達到程序無法繼續運行的水平。所以我的問題是,除了我有什麼需要包括另一個聲明,以免費文件sig或pclose照顧呢?

謝謝!

+0

sig只是一個指針。根據架構,它需要4或8個字節的內存。它沒有佔用足夠的空間。我敢打賭,fscanf正在返回並出錯。抓住返回值並檢查errno。 – Magn3s1um

+0

如果子進程由於某種原因無法產生預期的輸出,那麼'while(fgetc(sig)!='=');'將永遠循環。 – Casey

回答

1

因爲fscanf可以阻止。使用fcntl將從popen獲得的文件描述符設置爲非阻塞。

+0

感謝您的迴應!這是設置非阻塞的正確方法嗎? 'fcntl(fileno(sig),F_SETFL,O_NONBLOCK);'當我運行它時,出現「awk:關閉文件/ dev/stdout(Broken pipe)失敗」的錯誤。 – hein13

+0

是的,就是這樣。確保在嘗試通過執行fsync或flush之前關閉緩衝區。 – Magn3s1um

+0

我現在遇到問題fscanf返回-1並將errno設置爲EAGAIN。 – hein13