[英]broken pipe between cat and grep on Raspberry Pi
我正在嘗試在C程序中讀取無線連接鏈接的質量。
我做:
for(;;){
rf_line = popen("cat /proc/net/wireless | grep wlan0", "r");
fgets(line, 80, rf_line);
pclose(rf_line);
...
//more code
}
在帶有Wheezy 08/12圖像的Raspberry Pi上,它因errno 32破裂的管道而崩潰。 如果我打電話給cat /proc/net/wireless | grep wlan0
從控制台cat /proc/net/wireless | grep wlan0
,它工作正常。
另外,如果我嘗試使用gdb進行調試,則不會發生該錯誤。 在裝有Linux Mint 14的筆記本電腦上,這種情況永遠不會發生。
我試圖通過進行system(...)
調用來防止這種情況。 即使使用bash -c ...
打開新的bash。
我也嘗試過,不要寫標准輸出和文件,沒有運氣。
編輯:
與
rf_line = popen("/bin/grep wlan0 /proc/net/wireless", "r");
將行的大小增加到200無效。
我有相同的結果,錯誤32。
編輯:
與
rf_line = fopen("/proc/net/wireless","r");
我有相同的結果,錯誤32。
但是,這導致了一個建議,即popen無法正常工作,因為它是剩下的唯一管道。
Fopen / popen經常被調用,這可能是問題嗎?
請問有人,我接下來該怎么辦?
問候,Ck
從man 2 write
:
EPIPE :fd連接到讀數端關閉的管道或插座。 發生這種情況時,寫入過程還將收到SIGPIPE信號。 (因此,僅當程序捕獲,阻止或忽略此信號時,才能看到寫返回值。)
因此,如果您在完成寫任何操作之前關閉管道的末端,則用popen("...")
(不是您的程序)執行的命令將在其write()
和SIGPIPE信號上收到EPIPE錯誤。
您需要閱讀命令輸出的每一行,而不僅僅是第一行。 直到獲得EOF。
我不太確定popen的工作原理,但請嘗試。 也許它不適用於管道。
rf_line = popen("grep wlan0 /proc/net/wireless", "r");
另一種是添加絕對路徑,例如:
rf_line = popen("/bin/grep wlan0 /proc/net/wireless", "r");
要么
rf_line = popen("/usr/bin/grep wlan0 /proc/net/wireless", "r");
更新
這個為我工作。
#include <stdio.h>
int main(int argc, char** argv)
{
char line[200];
line[0] = '\0';
FILE* rf_line = popen("grep wlan0 /proc/net/wireless", "r");
fgets(line, 200, rf_line);
printf("%s", line); /* You can remove this */
pclose(rf_line);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.