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を開いても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 に答える