From: SHUDO Kazuyuki Date: 1999-10-10T15:09:49+09:00 Subject: [ruby-list:17586] Re: Exception.html & Errno.html for ruby-man-1.4.2-jp 首藤です。 なかださん wrote: > > - POSIX_SIGNAL > > sigaction() と sigprocmask() が利用できる場合にセットされる。 > > 単に sigaction() と sigprocmask() が利用できるということだけで > はなくて、この2つがあるということは POSIX signal semantics に従 > うシステムであるということで POSIX_SIGNAL がセットされるんじゃな > いでしょうか。 まさにその通りでした。 一応、FreeBSD (3.2R) で、BSD な signal() を使った場合と POSIX な sigaction() を使った場合でセマンティクスが異な ることを確認しました。 sigaction() では sa_flags = 0 (つまり SA_RESTART をセッ トしない) としておき、accept(2) をシグナルで中断してみて、 シグナルハンドラの実行完了後に accept() が再開するか (POSIX signal では SA_RESTART で制御可) しないかを調べました。 きちんと、BSD signal では勝手に再開し、 POSIX signal では accept(2) が EINTR で失敗しました。 自分の理解のためにも、もう一度整理してみようと思います。 SA_NODEFER (SA_NOMASK): ハンドラ実行中、シグナルの配送がブロックされる(false) か否(true) か。 SA_RESETHAND (SA_ONESHOT): シグナルが配送される際、そのシグナルのハンドラが SIG_DFL に設定される(true) か否(false) か。 SA_RESTART: シグナルの配送によって中断されたシステムコールが 勝手に再開される(true) か否(false) か。 そして、BSD signal のセマンティクスは次の通りです。 SA_NODEFER false (さらなる配送はブロックされる) SA_RESETHAND false (SIG_DFL に設定されない) SA_RESTART true (システムコールは再開される) すると、マクロ BSD_SIGNAL が意味を為してない or 設定方法が誤っているようです。 ruby (1.4.2) の configure.in を見ると、"for BSD signal semantics" と シグナルのセマンティクスを調べる目的で、 signal() を使った場合、シグナル配送の際にハンドラが SIG_DFL に リセットされるか否かをテストしています。 configure.in では、 SIG_DFL に設定される場合 (SA_RESETHAND で言えば true) に #define BSD_SIGNAL、 ハンドラが変更されない場合 (SA_RESETHAND false) に #undef BSD_SIGNAL と しています。これだと、BSD のセマンティクスかどうかを反映していません。 signal() と sigaction() のデフォルト (sa_flag = 0) の挙動の違いは、 シグナルの配送で中断されたシステムコールが再開されるか否か (SA_RESTART) です。configure でどうやって調べたらいいんでしょうね。 しかし、ruby のコンパイルのために、 マクロ BSD_SIGNAL は要らないように思います。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh@muraoka.info.waseda.ac.jp