gpt4 book ai didi

c - Raspberry Pi 上 cat 和 grep 之间的管道损坏

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:07 24 4
gpt4 key购买 nike

我正在尝试在 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 被频繁调用,这可能是问题所在吗?

有人知道我下一步该怎么做吗?

问候,查

最佳答案

来自 man 2 write:

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

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

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

关于c - Raspberry Pi 上 cat 和 grep 之间的管道损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18596380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com