2

私のプログラムには、この奇妙な問題があります:

パイプを介していくつかのコマンドの出力を読み取ることにより、デバイスを見つけようとします。

FILE* fp = NULL;
fp = popen ("cd /sys/bus/usb/devices; grep -i NDI */product", "r");

次に、fgets()を使用してファイル ストリームを読み取り、pclose()を使用してパイプを閉じます。

シングルスレッドプログラムではうまくいきました。しかし、マルチスレッド プログラムに統合した後、fgets() 関数がスレッドをランダムにブロックし始めました。

確認したところ、fpが空のファイル ストリームとして返されることがあるため、 fgets()がブロックされることがわかりました。fpのステータスを非ブロッキングに設定し、 read()を使用して ID でファイルを読み取ると、空のファイル ストリームのためにread()が -1 を返し、pclose()がハングすることがわかります。これらはすべてランダムに発生します。

したがって、この場合、 popen() を介して実行されたコマンドはハングし、決して終了しないと思います。しかし、なぜランダムに発生するのでしょうか? マルチスレッド プログラムには、ユーザー インターフェイスとの対話用に別のスレッドしかありません。パイプはローカルでのみ使用されるため、問題ないと思います。

どんなアイデアでも大歓迎です。ありがとう!


アップデート

strace は、子プロセスが一連の munmap() 呼び出しの後に futex() を呼び出し、そこでハングする場合があることを示しています: futex(0xb72eaf00, FUTEX_WAIT_PRIVATE, 2, NULL

通常、futex は呼び出されません。

参考までに、メイン プロセスの strace の出力:

1344962944.530384 pipe2([26, 27], O_CLOEXEC) = 0
1344962944.530441 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb41a8a68) = 25529
1344962944.534683 close(27)             = 0
1344962944.534801 fcntl64(26, F_SETFD, 0) = 0
1344962944.534852 write(1, "entering fgets\n", 15) = 15
1344962944.534924 fstat64(26, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
1344962944.534992 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb377d000
1344962944.535065 read(26, 

子プロセス シェルの strace の出力:

1344962944.534652 set_robust_list(0xb41a8a70, 0xc) = 0
1344962944.534790 getpid()              = 25529
1344962944.534843 getppid()             = 25453
1344962944.534917 close(12)             = 0
1344962944.534983 munmap(0xa8fff000, 1048576) = 0
...
1344962944.535925 munmap(0xb2728000, 118784) = 0
1344962944.535952 close(11)             = 0
1344962944.535980 close(10)             = 0
1344962944.536018 futex(0xb72eaf00, FUTEX_WAIT_PRIVATE, 2, NULL
4

0 に答える 0