argra****@users*****
argra****@users*****
2008年 12月 11日 (木) 00:37:06 JST
Index: docs/perl/5.8.8/perlipc.pod diff -u docs/perl/5.8.8/perlipc.pod:1.3 docs/perl/5.8.8/perlipc.pod:1.4 --- docs/perl/5.8.8/perlipc.pod:1.3 Wed Dec 10 03:49:10 2008 +++ docs/perl/5.8.8/perlipc.pod Thu Dec 11 00:37:06 2008 @@ -700,18 +700,20 @@ =end original -When a signal is delivered (e.g. INT control-C) the operating system -breaks into IO operations like C<read> (used to implement Perls -E<lt>E<gt> operator). On older Perls the handler was called -immediately (and as C<read> is not "unsafe" this worked well). With -the "deferred" scheme the handler is not called immediately, and if -Perl is using system's C<stdio> library that library may re-start the -C<read> without returning to Perl and giving it a chance to call the -%SIG handler. If this happens on your system the solution is to use -C<:perlio> layer to do IO - at least on those handles which you want -to be able to break into with signals. (The C<:perlio> layer checks -the signal flags and calls %SIG handlers before resuming IO operation.) -(TBT) +(INT control-C などで) シグナルが配送されると、 +OS は (Perl E<lt>E<gt> 演算子の実装で使われている) C<read> のような +I/O 操作を中断します。 +古い Perl ではハンドラをすぐに呼び出します +(そして C<read> はうまく動くので「安全ではない」ことはありません)。 +「保留」スキームではハンドラはすぐに呼び出されず、 +もし Perl がシステムの C<stdio> ライブラリを使っていると、ライブラリは +Perl に返って %SIG ハンドラを呼び出しする機会なしに C<read> を +再起動します。 +もしこれが起きた場合、解決法は、I/O を行うときにー +- 少なくともシグナルで中断できるようにしたいハンドルで - +C<:perlio> 層を使うことです +(C<:perlio> 層はシグナルフラグをチェックして、I/O 操作を続行する前に +%SIG ハンドラを呼び出します。) =begin original @@ -854,10 +856,8 @@ C<wait> することを想定されているものもあります。 このようなシステムでは保留シグナルスキームはこれらのシグナルでは 動作しません(C<wait> しません)。 -Again the failure will -look like a loop as the operating system will re-issue the signal as -there are un-waited-for completed child processes. -(TBT) +再び、問題は、wait していない完了した子プロセスがあるかのようにシグナルが +再び発生することでループのように見えます。 =back @@ -921,7 +921,7 @@ =end original 特定のプログラムの一つが @ARGV にあるファイル名を期待している -Perl スクリプトであっていいのなら、賢いプログラマーは以下のように +Perl スクリプトであっていいのなら、賢いプログラマは以下のように 書くこともできます: % program f1 "cmd1|" - f2 "cmd2|" f3 < tmpfile @@ -1396,17 +1396,16 @@ =end original -これに関る問題は、UNIX のバッファリングが実際にはある時点に至るまで +これに関する問題は、UNIX のバッファリングが実際にはある時点に至るまで 留まるということにあります。 ファイルハンドル C<Writer> を自動フラッシュにしたとしても、もう一方の -端点にあるプロセスは送られたデータを timley manner に従って -受け取ることになるでしょう。 -一般的に云って、全てのことに関して即座に反応するように強制することは -できません。 +端点にあるプロセスは送られたデータを適当なタイミングで +受け取ることになります; 一般的に云って、全てのことに関して即座に +反応するように強制することはできません。 上記の例では、バッファリングをしないようにするために B<-u> フラグを I<cat> に与えることができたのでそれができました。 パイプ越しに使われることを想定して設計された UNIX コマンドは非常に -少数なので、この例のようなことは、dboule-ened パイプのもう一方の端点にある +少数なので、この例のようなことは、両端のあるパイプのもう一方の端点にある プログラムを自分自身で書かない限りはほとんどできないのです。 =begin original @@ -2262,7 +2261,7 @@ システムでなら C<"daytime"> を使うこともできました [FOOTNOTE: UNIXでは I</etc/services> にシステムサービスファイルがあります]。 しかし、実際には括弧でくくって (13) というポート番号の指定を行っていました。 -単に番号を使っても同様に動作するのですが、定数は注意深いプログラマーを +単に番号を使っても同様に動作するのですが、定数は注意深いプログラマを 神経質にさせてしまいます。 =back @@ -3135,7 +3134,7 @@ Richard Stevens による非常に重要な教科書 I<Unix Network Programming, 2nd Edition, Volume 1> (Prentice-Hall から出版されています)があります。 -ネットワークに関するほとんどの本は、C プログラマーを対象としている点に +ネットワークに関するほとんどの本は、C プログラマを対象としている点に 注意してください。 Perl への変換は、読者の宿題として残しておきます。