[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 メーリングリストの案内