Shiro Kawai
shiro****@lava*****
2006年 3月 26日 (日) 11:32:02 JST
そうかぁ。ちょっと気になってはいたんですが、やっぱりちゃんと やらないとダメですね。 ハンドシェークするのが確実だと思います。つまり、子プロセスで 別プログラムの起動が済んだことを何らかの方法で親プロセスに伝え、 それからSIGINTを送るようにすると。 catの出力をパイプで読んでればいいんじゃないかな。ちょっとやってみます。 --shiro From: Tatsuya BIZENN <bizen****@arthu*****> Subject: [Gauche-devel-jp] Re: [kahua-dev:01273] Re: kahua-spvr のシグナルマスクについて Date: Sun, 26 Mar 2006 11:23:47 +0900 > 備前です。Gaucheの実装についての話なので、 > gauche-devel-jpに振ります。 > > On 2006/03/26, at 0:24, Shiro Kawai wrote: > > > これに直接かかわるかどうかは定かではありませんが。 > > スレッドから別プロセスを起動する際に、0.8.7ではシグナル > > マスクを > > sys-exec, sys-fork-and-exec, run-process等に与えることが > > できるようになります。のでシグナルマスク回りの処理が少し > > きれいに書けるようになるのではないかと思います。 > > 今朝のCVS HEADに上記の変更が入っていたようなので試して > 見たのですが、Gaucheのmake check時に > 「test fork, exec and signal mask:」のところで刺さります。 > 調べてみると、killしたはずのcatのプロセスが残ってお > り、 > こいつに外からkill -INTしてやると、何事もなかったかのように > テストが進行し、全てpassで終了します。 > > コードをざっと見た感じでは、シグナルハンドラをSIG_IGNに > してからScm_SysSigmask(3)でシグナルマスクを設定し、その後 > execvp(2)しているので、fork(2)後にexecvp(2)するまで > の間に > シグナルを受けると無視してしまうんだと思います。 > > さしあたりテストが止まらないようにするには、 > > Index: test/system.scm > =================================================================== > RCS file: /cvsroot/gauche/Gauche/test/system.scm,v > retrieving revision 1.34 > diff -u -r1.34 system.scm > --- test/system.scm 25 Mar 2006 14:15:26 -0000 1.34 > +++ test/system.scm 26 Mar 2006 02:20:29 -0000 > @@ -441,6 +441,7 @@ > (sys-fork-and-exec "cat" '("cat") > :iomap `((0 . ,in) (1 . ,out) > (2 . ,out)) > :sigmask cmask) > + (sys-sleep 1) > (sys-kill pid SIGINT) > (sys-sigmask SIG_SETMASK omask) > (sys-waitpid pid) > > execされてからkillすればいいだけなんですが、本質的には > どうするのが正しいんでしょう。 > > -- > 備前 達矢 > > > _______________________________________________ > Gauche-devel-jp mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp >