[Armadillo:08692] Re: Armadillo-460 pppd切断時にpppdがゾンビ化する

TANAKA Toshihisa email@hidden
2013年 3月 20日 (水) 00:10:07 JST


としです.

>   waitpid( pppdのPID, NULL, WNOHANG ) ;
>    というコードで試してみましたがだめでした。

この時の waitpid() の戻り値は,ppid の PID でしょうか?

それと,pppd がゾンビプロセスになるとの事で,pppd を生成した回数と,
ゾンビプロセスになった pppd の数は合いますでしょうか?

これは私見の推測ですが,数が合わない(生成した回数>ゾンププロセス数)であるならば,
waitpid() で回収する回数が足りないのかも...と思っています.

例えば,SIGCHLD ハンドラあるいは SIGCHLD を受け取るスレッドで,

while(waitpid(-1, &status, WNOHANG) > 0){ /* 状態変化している子プロセスがいる限りぶん回す */ }

とすると,ゾンビプロセスが減ったりしないでしょうか.
ONICOSの中山さんが記しています,

> 親プロセスはループしながら絶えず
> waitpid(-1, &status, WNOHANG)
> を呼び続けています。

は,while() かそれに相当するもので生成数に関係なく waitpid() を呼びつづけていらっしゃると思います.

何にしましても,waitpid() の戻り値を waitpid() の man と照らし合わせることで,何か解決の糸口が見えるのではないかと思います.

または,/proc/[pppd の pid]/stat を確認して,pppd の親プロセスが期待した pid であるかも確認点かと思っています.

もう一つ引っかかるのは,FOMA 接続していらっしゃるとの事で,通信装置にあたる TTY ドライバ等のデバイスドライバが
close() を呼ばれた時に,何らかの理由で止まっていないかなぁとも思います.
通信にお使いのデバドラが uninterruptible で何か待っていると,SIGKILL でも死なないような気がするのです...
(確かその様に記憶しているのですが,外しているかもしれません.その際はご勘弁下さい)

ではこれにて.



armadillo メーリングリストの案内