簡體   English   中英

Raspberry Pi上的貓和grep之間的管道破裂

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM