[Armadillo:01244] Re: Armadillo220のflatfsdコマンド

email@hidden
2006年 9月 21日 (木) 22:51:59 JST


お世話になります。

> forkシステムコールの代りに vforkを使うのが常套手段となっていますが、
> vforkの挙動で違ったところはどこでしょうか?

いろいろなことを平行してやっていたのであまり自信がないのですが、Jはvforkで親プロセスがexec*するまで止まっていたと思うのですが、220で
はvforkで親プロセスも待たずに動いていた気がします。
ただ、この点はvforkの情報を見ると親が止まっていることをあてにしてはいけない、と書かれていますね。

> また、signalまわりで違った挙動を起す状況やシグナル、システムコールなど
> を教えていただけますか?

220で、system関数を使用した際に気がついたのですが、すでにvfork+exec*で子プロセスが存在している状態でsystem関数を使用すると、system
関数内のwait(wait4)で子プロセスの終了をキャッチできず、待ち続けるという状況が発生しました。もともとSIGCHLDで登録したハンドラで
キャッチしてしまっていました。本来system関数ではもともとのシグナルを一度退避し、SIGCHLDも退避するのでもともとのハンドラは起動され
ず、system関数内のwaitで終了をキャッチする仕組みになっていますが、ここがうまく機能しなかったようです。system関数同等のソースを自作し
て確認しても同様でした。
子プロセスがいない状態ではsystem関数は正常に動いたのですが、子プロセスがいる場合にうまくいかなかったようです。
結局余り時間もなかったため、system関数で外部コマンドを使うのをやめて、アプリ内部で処理するようにして対応しました。

ただ、いずれもじっくりと検証したわけではないので、参考程度に・・・。


ついでに、Jや220でntpdを使いたくなり、220はすんなりmenuconfigで有効にするだけで使えましたが、Jはビルドエラーになりました。
user/ntp/ntpdのmakeでHAVE_DAEMONとHAVE_MLOCKALLをアンデファインにすれば良いことはすぐにわかったのですが、これまた調べている時間がな
かったので、ntpd.cの先頭に
#undef HAVE_DAEMON
#undef HAVE_MLOCKALL
の2行を追加して強引にビルドしました。
動作は問題ないようです。
ただし、init.d->rc.dでntpdやntpdateを起動する際に、TZ環境変数がJST-9にセットされていることが望ましいのですが、220の
romfs/etc/init.d/rcで、先頭に、
PATH=/bin:/sbin:/usr/bin:/usr/sbin
TZ=JST-9
の記述があるものの、
export TZ PATH
を追加しないとTZが有効にならないようでした。
これまたあまりシェルスクリプトは得意でないので当たり前のことかもしれませんが。。
さらに、Jでは、
romfs/etc/rc.d/S40network
の直後にntpdateで時刻あわせをしようとすると大抵失敗するようで、ntpdateを2回実行するとOKでした。
ネットワークが完全稼動するのに多少待ちがひつようなのかもしれないと、勝手に解釈して2回にしました。
220は1回で成功します。


まとまりのない情報ですいません。
メーリングリストに助けられましたので、せめてもの恩返しと、自分で引っかかったポイントを書いてみました。
どなたかのお役に立てれば幸いです。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
小俣光之(Mitsuyuki Komata)
日本シー・エー・ディー株式会社
   TEL:03-3565-3011(直)・2011(代)  FAX:03-3565-3611
E-Mail: email@hidden
Office-URL: http://www.ncad.co.jp/
Private-URL: http://www.ncad.co.jp/~komata/
_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/




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