Go to the first, previous, next, last section, table of contents.


システム操作関数

Function: alarm seconds
指定した秒数が経過した後に、自プロセスに SIGALRM が送られてくるようにし ます。(マシンによっては、秒の数え方が異なるため、指定した秒数よりも最大 で 1 秒少ない経過時間となります。)一度には 1 つのタイマだけが設定可能で す。呼び出しを行なう度に、以前のタイマを無効にしますし、新しくタイマを起 動しないで以前のタイマをキャンセルするために引数に 0 を指定して呼び出す ことができます。以前のタイマの残り時間が、返却値となります。

1 秒より精度の高いスリープを行なうには、setitimer(2) をサポートしている システムでは、Perl の syscall() インタフェースを使ってアクセスすることが できますし、サポートしていなければ、このドキュメントのどこかにある select() の項を参照してください。

Function: chdir expr
(可能であれば、) カレントディレクトリを expr に移します。 expr を指定しないと、ホームディレクトリに移ります。成功時には真を 返し、そうでなければ偽を返します。die() の項の例を参照してくださ い。

Function: chroot filename
同じ名前のシステムコールと同じことをします。それが何をするものかを、知ら なくても気にしないでください。filename を省略すると、$_ へ chroot します。

Function: die list
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() も参照してくだ さい。

Function: exec list
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 シェルの振りをする

Function: exit expr
expr を評価し、即座にその値を持って終了します。(実際には、まず、定 義されている END ルーティンを呼び出しますが、END ルーティンは exit を止 められません。同様に、呼び出す必要のあるオブジェクトデストラクタはすべて、 exit の前に呼び出されます。) 例:
$ans = <STDIN>;
exit 0 if $ans =~ /^[Xx]/;

die() も参照してください。expr が省略された場合には、ステー タスを 0 として終了します。

Function: fork
システムコール fork(2) を行ないます。親プロセスには、チャイルドプロセス の pid を、チャイルドプロセスに 0 を返しますが、fork に失敗したときには、 未定義値を返します。注: フラッシュされていないバッファは、どちらのプロセ スに対しても、フラッシュされていないままとなっています。これは、出力がダ ブルのを避けるためには、$| (English では $AUTOFLUSH) を設定するか、ファ イルハンドルメソッド autoflush() を呼ぶ必要があるかもしれないということ です。

チャイルドプロセスの終了を待たずに、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);

Function: getlogin
もしあれば、/etc/utmp から現在のログイン名を返します。ヌルであれば、 getpwuid() を使ってください。
$login = getlogin || (getpwuid($<))[0] || "Kilroy";

Function: getpgrp pid
Function: getpgrp
指定された pid の現在のプロセスグループを返します。pid に 0 を与えるとカレントプロセスの指定となります。getpgrp(2) をインプリメント していないマシンで実行した場合には、致命的エラーとなります。pid を 省略するとカレントプロセスのプロセスグループを返します。

Function: getppid
親プロセスのプロセス id を返します。

Function: getpriority which,who
プロセス、プロセスグループ、ユーザに対する現在の優先度を返します。 (getpriority(2) manpage を参照してください。)getpriority(2) をインプリメ ントしていないマシンで実行した場合には、致命的エラーとなります。

Function: getpwnam name
Function: getgrnam name
Function: gethostbyname name
Function: getnetbyname name
Function: getprotobyname name
Function: getpwuid uid
Function: getgrgid gid
Function: getservbyname name,proto
Function: gethostbyaddr addr,addrtype
Function: getnetbyaddr addr,addrtype
Function: getprotobynumber number
Function: getservbyport port,proto
Function: getpwent
Function: getgrent
Function: gethostent
Function: getnetent
Function: getprotoent
Function: getservent
Function: setpwent
Function: setgrent
Function: sethostent stayopen
Function: setnetent stayopen
Function: setprotoent stayopen
Function: setservent stayopen
Function: endpwent
Function: endgrent
Function: endhostent
Function: endnetent
Function: endprotoent
Function: endservent
これらのルーティンは、システムライブラリの同名の関数を実行します。リスト コンテキストでは、さまざまな get ルーティンからの返却値は、次のようにな ります:
($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 することができます。

Function: glob expr
expr の値を、シェルが行なうように、ファイル名の展開を行なって返し ます。これは、<*.*> 演算子をインプリメントする内部関数です。

Function: kill list
プロセスのリストにシグナルを送ります。list の最初の要素は、送信す るシグナルでなくてはなりません。シグナル送信に成功したプロセスの数を返し ます。
$cnt = kill 1, $child1, $child2;
kill 9, @goners;

シェルとは異なり、Perl では、シグナルに負の数を与えると、プロセスではな く、プロセスグループに対して、kill を行ないます。(Syetem V では、プロセ ス番号として負の値を与えても、プロセスグループの kill を行ないますが、移 植性がありません。)すなわち、通常は、負のシグナルは用いず、正のシグナル を使うことになります。シグナル名をクォートして使うこともできます。

Function: setpgrp pid,pgrp
指定した pid (0 を指定するとカレントプロセス) に対するプロセスグルー プを設定します。setpgrp(2) がインプリメントされていないマシンでは、致命 的エラーが発生します。

Function: setpriority which,who,priority
プロセス、プロセスグループ、ユーザに対する優先順位を設定します。 (setpriority(2) を参照してください。) setpriority(2) がインプリメントさ れていないマシンでは、致命的エラーが発生します。

Function: sleep expr
Function: sleep
スクリプトを expr で指定した秒数 (省略時には、永久に)スリープさせ ます。そのプロセスには、`SIGALRM' を送ることで、割り込みを掛けるこ とができます。実際にスリープした秒数を返します。sleep() は、 alarm() を使ってインプリメントされることが多いので、 alarm()sleep() は、おそらく混ぜて使用することはできま せん。

古いシステムでは、どのように秒を数えるかによって、要求した秒数に完全に満 たないうちに、スリープから抜ける場合があります。最近のシステムでは、常に 完全にスリープします。

Function: syscall list
list の最初の要素で指定するシステムコールを、残りの要素をそのシス テムコールの引数として呼び出します。インプリメントされていないときには、 致命的エラーとなります。引数は、以下のように解釈されます: 引数が数字であ れば、int として引数を渡します。そうでなければ、文字列値へのポインタが渡 されます。文字列に結果を受け取るときには、その結果を受け取るのに十分なく らいに、文字列を予め伸ばしておく必要があります。整数引数が、リテラルでな く、数値コンテキストで評価されたことのないものであれば、数値として解釈さ れるように、0 を足しておく必要があるかもしれません。
require 'syscall.ph'; # h2ph を実行する必要があるかも
syscall(&SYS_write, fileno(STDOUT), "hi there\n", 9);

Perl は、システムコールに最大 14 個の引数しか渡せませんが、実用上問題は ないでしょう。

Function: system list
exec LIST とほとんど同じですが、まず fork を行ない、親プロ セスではチャイルドプロセスが終了するのを wait します。exec の項で述べたように、引数の処理は、引数の数によって異なることに注意してく ださい。返却値は、wait() が返すプログラムの exit 状態です。実際の exit 値を得るには 256 で割ってください。このドキュメントの exec の項も参照してください。

Function: times
現プロセスと、そのチャイルドプロセスに対する、ユーザ時間とシステム時間を 秒で示した、4 要素のリスト値を返します。
($user,$system,$cuser,$csystem) = times;

Function: umask expr
Function: umask
現在のプロセスの umask を設定し、以前の値を返します。expr が省略さ れると、単にその時点の umask の値を返します。

Function: wait
チャイルドプロセスが終了するのを待ち、消滅したプロセスの pid を返します。 チャイルドプロセスが存在しないときには、-1 を返します。ステータスは $? に返されます。

Function: waitpid pid,flags
特定のチャイルドプロセスが終了するのを待ち、消滅したプロセスの pid を返 します。指定したチャイルドプロセスが存在しないときには、-1 を返します。 ステータスは $? に返されます。
use POSIX "wait_h";
...
waitpid(-1,&WNOHANG);

とすると、ブロックが起こらないようにして、任意のプロセスを wait します。ブロックなしの wait は、システムコール waitpid(2) か、シ ステムコール wait4(2) をサポートしているマシンでのみ利用可能です。しかし ながら、特定の pid を 0 の flags での wait はどこでもインプ リメントされています。(exit したプロセスのステータス値を覚えておいて、 Perl がシステムコールをエミュレートしますが、Perl スクリプトには取り入れ られていません。)

Function: warn list
die() と同じように STDERR にメッセージを出力しますが、exit したり、 例外を発生させたりしません。


Go to the first, previous, next, last section, table of contents.

検索式: