1 秒より精度の高いスリープを行なうには、setitimer(2) をサポートしている システムでは、Perl の syscall() インタフェースを使ってアクセスすることが できますし、サポートしていなければ、このドキュメントのどこかにある select() の項を参照してください。
die()
の項の例を参照してくださ
い。
chroot
します。
eval()
の外では、list の値を STDERR に出力し、その時点の $!
(errno) の値で exit します。$! の値が 0 ならば、($? >> 8) (`command` の
ステータス) の値で exitします。($? >> 8) も 0 であれば、255 で exit する
ことになります。eval()
の中で使用すると、エラーメッセージが、$@
に入れられます。eval()
は中断され、未定義値を返します。
同値な例:
die "Can't cd to spool: $!\n" unless chdir '/usr/spool/news'; chdir '/usr/spool/news' or die "Can't cd to spool: $!\n"
$var{list} の評価結果が改行で終わっていなければ、その時点のスクリプト名 とスクリプトの行番号、(もしあれば) 入力ファイルの行番号と改行文字が、続 けて表示されます。ヒント: メッセージの最後を ", stopped" のようなもので 終わるようにしておけば、"at foo line 123" のように追加されて、わかりやす くなります。"canasta" というスクリプトを実行しているとすると、
die "/etc/games is no good"; die "/etc/games is no good, stopped";
は、それぞれ
/etc/games is no good at canasta line 123. /etc/games is no good, stopped at canasta line 123.
と表示することになります。exit()
と warn()
も参照してくだ
さい。
exec()
関数は、システムのコマンドを実行し、戻ってはきません。戻っ
て欲しい場合には、system()
関数を使ってください。
list に複数の引数がある場合か、list が複数の値を持つ配列の場
合には、list の引数を使って、execvp(3) を呼び出します。1 つのスカ
ラ引数のみの場合には、その引数からシェルのメタ文字をチェックします。もし、
メタ文字があれば、引数全体を `/bin/sh -c' に渡して解析させます。も
し、なければ、その引数を単語に分け、より効率的な execvp() に直接、渡しま
す。注: exec()
(と system()
)は出力バッファをフラッシュしま
せんので、出力をなくしたくなければ、$| を設定する必要があるかもしれませ
ん。例:
exec '/bin/echo', 'Your arguments are: ', @ARGV; exec "sort $outfile | uniq";
第一引数に指定するものを本当に実行したいが、実行するプログラムに対して別 の名前を教えたい場合には、list の前に、「間接オブジェクト」(コンマ なし) として、実際に実行したいプログラムを指定することができます。(これ によって、list に単一のスカラしかなくても、複数値のリストであるよ うに、list の解釈を行ないます。)例:
$shell = '/bin/csh'; exec $shell '-sh'; # login シェルの振りをする
あるいは、より直接的に、
exec {'/bin/csh'} '-sh'; # login シェルの振りをする
$ans = <STDIN>; exit 0 if $ans =~ /^[Xx]/;
die()
も参照してください。expr が省略された場合には、ステー
タスを 0 として終了します。
チャイルドプロセスの終了を待たずに、fork() を繰り返せば、ゾンビをため込 むことになります:
$SIG{'CHLD'} = sub { wait };
ダブル fork
という仕掛けも使えます (fork
の返却値のエラー
チェックは省いています);
unless ($pid = fork) { unless (fork) { exec "what you really wanna do"; die "no exec"; # ... または ... some_perl_code_here; exit 0; } exit 0; } waitpid($pid,0);
getpwuid()
を使ってください。
$login = getlogin || (getpwuid($<))[0] || "Kilroy";
($name,$passwd,$uid,$gid, $quota,$comment,$gcos,$dir,$shell) = getpw* ($name,$passwd,$gid,$members) = getgr* ($name,$aliases,$addrtype,$length,@addrs) = gethost* ($name,$aliases,$addrtype,$net) = getnet* ($name,$aliases,$proto) = getproto* ($name,$aliases,$port,$proto) = getserv*
(エントリが存在しなければ、空リストが返されます。)
スカラコンテキストでは、*nam、*byname といった name で検索するもの 以外は、name を返し、name で検索するものは、何か別のものを返します。 (エントリが存在しなければ、未定義値が返ります。)たとえば:
$uid = getpwnam $name = getpwuid $name = getpwent $gid = getgrnam $name = getgrgid $name = getgrent etc.
getgr*() によって返る値 $members は、グループのメンバのログイン名をスペー スで区切ったものです。
gethost*() 関数では、C で h_errno 変数がサポートされていれば、関数呼出が 失敗したときに、$? を通して、その値が返されます。成功時に返される @addrs 値は、対応するシステムコールが返す、生のアドレスのリストです。イ ンターネットドメインでは、個々のアドレスは、4 バイト長で、
($a,$b,$c,$d) = unpack('C4',$addr[0]);
のようにして、unpack
することができます。
$cnt = kill 1, $child1, $child2; kill 9, @goners;
シェルとは異なり、Perl では、シグナルに負の数を与えると、プロセスではな く、プロセスグループに対して、kill を行ないます。(Syetem V では、プロセ ス番号として負の値を与えても、プロセスグループの kill を行ないますが、移 植性がありません。)すなわち、通常は、負のシグナルは用いず、正のシグナル を使うことになります。シグナル名をクォートして使うこともできます。
sleep()
は、
alarm()
を使ってインプリメントされることが多いので、
alarm()
と sleep()
は、おそらく混ぜて使用することはできま
せん。
古いシステムでは、どのように秒を数えるかによって、要求した秒数に完全に満 たないうちに、スリープから抜ける場合があります。最近のシステムでは、常に 完全にスリープします。
require 'syscall.ph'; # h2ph を実行する必要があるかも syscall(&SYS_write, fileno(STDOUT), "hi there\n", 9);
Perl は、システムコールに最大 14 個の引数しか渡せませんが、実用上問題は ないでしょう。
exec LIST
とほとんど同じですが、まず fork
を行ない、親プロ
セスではチャイルドプロセスが終了するのを wait
します。exec
の項で述べたように、引数の処理は、引数の数によって異なることに注意してく
ださい。返却値は、wait()
が返すプログラムの exit 状態です。実際の
exit 値を得るには 256 で割ってください。このドキュメントの exec
の項も参照してください。
($user,$system,$cuser,$csystem) = times;
use POSIX "wait_h"; ... waitpid(-1,&WNOHANG);
とすると、ブロックが起こらないようにして、任意のプロセスを wait
します。ブロックなしの wait
は、システムコール waitpid(2) か、シ
ステムコール wait4(2) をサポートしているマシンでのみ利用可能です。しかし
ながら、特定の pid を 0 の flags での wait
はどこでもインプ
リメントされています。(exit したプロセスのステータス値を覚えておいて、
Perl がシステムコールをエミュレートしますが、Perl スクリプトには取り入れ
られていません。)
die()
と同じように STDERR にメッセージを出力しますが、exit したり、
例外を発生させたりしません。
Go to the first, previous, next, last section, table of contents.