【问题标题】:broken pipe between cat and grep on Raspberry PiRaspberry Pi 上 cat 和 grep 之间的管道损坏
【发布时间】:2013-09-03 15:45:25
【问题描述】:

我正在尝试读取 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 ... 打开一个新的 bash。
我也试过,不写到标准输出和文件,没有运气。

编辑:

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

【问题讨论】:

  • 你的程序走了多远?你有line,你打电话给pclose()了吗?
  • 当我在 gdb 中执行此操作时,每个断点都会被命中,并且我得到了正确的行。如果我清除断点并继续,管道会在 popen 结束之前中断。
  • @ChristophKuhr 请检查我的更新。
  • @konsolebox 没有效果。
  • Popen 被频繁调用,这可能是个问题吗?

标签: c linux bash shell raspberry-pi


【解决方案1】:

来自man 2 write

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

因此,您使用popen("...")(不是您的程序)执行的命令将在write() 上收到EPIPE 错误,如果您在完成写入任何内容之前关闭管道末端,则会收到SIGPIPE 信号。

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

【讨论】:

  • +1 我其实是在其中一个头文件中找到了定义,但我不知道它的具体含义。
【解决方案2】:

我不太确定 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);
}

【讨论】:

  • 顺便说一句,您可以避免依赖grep,只需阅读/proc/net/wirelessfopen 的每一行并在其上使用strstr
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 2020-03-29
  • 1970-01-01
  • 2020-07-22
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多