1

我正在尝试读取 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从控制台调用,它工作正常。

另外,如果我尝试使用 gdb 进行调试,则不会发生错误。在我装有 Linux Mint 14 的笔记本电脑上,它永远不会发生。

我试图通过system(...)拨打电话来防止这种情况发生。即使使用bash -c ....
我也试过,不写到标准输出和文件,没有运气。

编辑:

rf_line = popen("/bin/grep wlan0 /proc/net/wireless", "r");

将行的大小增加到 200 没有效果。

我有同样的结果,errno 32。

编辑:

rf_line = fopen("/proc/net/wireless","r");

我有同样的结果,errno 32。

然而,这导致了这样的建议,即 popen 无法正常工作,因为它是唯一剩下的管道。
Fopen / popen 被频繁调用,这可能是问题吗?

有没有人知道我接下来能做什么?

问候,CK

4

2 回答 2

2

来自man 2 write

EPIPE : fd 连接到读取端关闭的管道或套接字。当这种情况发生时,写入过程也会收到一个SIGPIPE信号。(因此,只有当程序捕获、阻塞或忽略此信号时,才会看到写入返回值。)

因此,如果您在管道结束写入任何内容之前关闭管道末端,那么您使用(而不是您的程序)执行的命令popen("...")将在其上得到 EPIPE 错误和 SIGPIPE 信号。write()

您需要阅读命令输出的每一行,而不仅仅是第一行。直到你得到EOF。

于 2013-09-03T17:26:53.600 回答
1

我不太确定 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);
}
于 2013-09-03T15:50:08.600 回答