[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00266] Re: return value and other



 元木です。

In [freewnn : No.00264]
  Kaoru Fukui <k_fukui@highway.ne.jp> wrote:

| jserver,cserver,tserver,kserver 総てのserverの戻り値が
| 設定されていませんので
| int main(){ return 0;} のreturn 0;に当たる記述がde.cに
| 見当たりません。

 Xsi/Wnn/jserver/de.c の 229行目あたりの _exit がそれに当たります。

>	if (fork()) {
>	    signal(SIGCHLD , _exit);
>	    signal(SIGHUP , SIG_IGN);
>	    signal(SIGINT , SIG_IGN);
>           signal(SIGQUIT, SIG_IGN);
>#ifdef  SIGTSTP
>           signal(SIGTSTP, SIG_IGN);
>#endif
>           signal(SIGTERM, _exit); <---- これ
>           pause();
>       }

 で、その下の 265行目あたりで SIGTERM を送って親プロセスを 
 kill しています。

>#ifndef NOTFORK
>	/* End of initialization, kill parent */
>	kill(getppid(), SIGTERM); <---- これ
>	fclose(stdin);
>	fclose(stdout);

# glibc での話です。違う実装もあるかも。

 そのため SIGTERM のシグナルハンドラーたる _exit は、SIGTERM 
 を引数として _exit (SIGTERM) と呼ばれます。

 そうすると Linux では SIGTERM == 15 ですので tserver からの
 戻り値は 15 になります。

 というわけで、

| [ $? = 15 -o $? = 0 ] && echo_success || echo_failue

 となっているのだと思います。

 本当は、いきなり _exit をシグナルハンドラーにするのではなく
 一枚関数をかまして処理すべきだと思います。

 正常終了なのに 15 が返るなんてのは気分が悪い :-)

| それにtserverの起動終了はcwnnkillではダメなのでしょうか?

 むう。やっぱりわかりにくいですかね ^^;
 "cwnnkill -L zh_TW" で大丈夫なはずです。

# -DTAIWANESE をつけて cwnnkill をコンパイルしなおして 
#  twnnkill とかにしてもいいかも知れない。

sin.