From: SHUDO Kazuyuki Date: 1999-10-09T14:44:05+09:00 Subject: [ruby-list:17565] Re: Exception.html & Errno.html for ruby-man-1.4.2-jp まつもとさん wrote: > これはですね。ちょっと難しいんですが、SIGPIPEが複数来るんで > 例外処理中にまたシグナルが来て失敗してるんですね。 ちらっと ruby 1.4.2 のコードを見たところ、 シグナルに関する OS ごとの挙動の違いを吸収し切れていないように見えます。 - シグナルハンドラ実行中、シグナルの発生がブロックされるか否か。 (SA_NODEFER) - シグナルハンドラが呼ばれる際、そのシグナルのハンドラが SIG_DFL にリセットされるか否か。 (SA_RESETHAND) - シグナルハンドラによって中断されたシステムコールが再起動されるか否か。 (SA_RESTART) これらのがどのように設定されるか、 OS によってまちまちになってしまっていないでしょうか。 POSIX な API (sigaction とか) を利用できない場合は仕方ないですが、 struct sigaction のメンバ sa_flags をもう少しまめに設定した方が ベターだと思います。 また… signal.c と eval.c 中で、 autoconf が設定してくれるマクロ BSD_SIGNAL と POSIX_SIGNAL を見ていますが、 このマクロの利用法が適当でないように思います。 シグナルハンドラ (sighandle(sig)) 中で #if !defined(POSIX_SIGNAL) && !defined(BSD_SIGNAL) ruby_signal(sig, sighandle); #endif と、マクロ POSIX_SIGNAL が定義されている場合はシグナルハ ンドラの再設定をしないようになっています。しかし、 POSIX_SIGNAL は、関数 sigprocmask と sigaction が利用で きる場合にセットされるものなので、このマクロを、 再設定が要るか要らないかの判断に用いるのは適当ではないと思います。 - POSIX_SIGNAL sigaction() と sigprocmask() が利用できる場合にセットされる。 - BSD_SIGNAL シグナルが発生してもシグナルハンドラが (SIG_DFL に) 変更されないなら、 セットされる。 シグナルっていろいろやっかいですね。#腕の見せどころではありますが。 最近、Sun Developer connection (SDC, http://sdc.sun.co.jp/) に 参考になりそうな記事がありました。 「UNIX アプリケーションの Solaris(TM) オペレーティング環境への移植」 ただし、SDC にユーザ登録しないと読めないです。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh@muraoka.info.waseda.ac.jp