プロセスを制御する様々なシステムコールが用意されています。実際には子 プロセスを生成したり(fork)、そのプロセスに別の仕事をさせたり(exec)する 作業はプロセス間通信とあわせて8.2.で説明します。ここでは単一のプロセス で使われるものを見ます。
単一のプロセスで出来ることはあまり多くありません。自分を終了させます。
exit( status );
ここでstatusは自分を生成した親に返される状態データです。
一定の時間休眠します。
sleep( seconds );
ここでsecondは休眠する時間を秒で表わす整数です。最低の単位はですから1 秒ということになります。オンラインシステムを考えるとちょっと荒すぎる単 位ですね。実はもっと細かい単位で待つことは可能です。あとから出てくる時 間管理とシグナルを参照してください。
UNIXではプロセスはPID(プロセスID)により一意的に特定できるようになっ ています。このPIDはpsコマンドで見ることも出来ますし、コマンドをバック グラウンドで走らせたときなども端末に表示されます。プログラムの中でPID を調べる方法が用意されています。
int pid; pid = getpid( );
自分のPIDが返ります。プロセス間通信などに関連して自分のPIDを調べる必要 がある場合があります。親プロセスのPIDを同様に調べることが出来ます。な ぜ親のPIDを調べる必要があるかって? それは追々。
int ppid; ppid = getppid( );
また、プロセスはそれが所属するユーザIDやグループIDを持っています。 UNIXではアクセス制御は全てUIDやGIDで判断して行われます。基本的にUIDや GIDは自分の親から引き継がれます。そうするとちょっと不便な事も起こりま す。例えばシステムワイドに用意されたデータベースファイルの内容を更新す ることが平のユーザには出来ないことになります。これを回避するために次の ような仕組みが用意されています。ご存じのようにファイルには許可モードが あります。ls -lで見たり、chmodで変更することが出来ます。このビットの中 に実行時UID設定ビットと実行時GID設定ビットがあります。例えば実行時UID 設定ビットがたったファイルを実行すると、それによって生成されたプロセス の実効的なUIDが走らせたユーザのものでなくファイルの所有者のUIDに設定さ れます。次の例を見てみましょう。
% ls -l /bin/passwd /etc/passwd -rwsr-xr-x 5 root 32768 Jul 24 1992 /bin/passwd -rw-r--r-- 1 root 6249 Jul 12 10:59 /etc/passwd
ユーザを管理するパスワードファイル/etc/passwdは所有者rootだけがw(書き 込み)可能で、それ以外のユーザにはrしか許されていません。ところがパスワー ド更新コマンド/bin/ passwdには所有者の実効許可xのかわりにsと書いてあり ます。これが実効時UID設定を示します。ユーザは/bin/passwdを実行するとそ のプロセスのUIDは/bin/passwdの所有者であるrootに設定されます。この結果 rootにのみ書き込み許可が与えられている/etc/passwdを書き換えることが出 来るわけです。本来のUID(GID)を実UID(実GID)、実行時設定によるUID( GID) を有効UID(有効GID)と呼びます。man chmodおよびman 2 chmodをやってみてく ださい。それぞれを調べるシステムコールが用意されています。
int ruid, euid, rgid, egid; ruid = getuid( ); /* 実UID */ euid = geteuid( ); /* 有効UID */ rgid = getgid( ); /* 実GID */ egid = getegid( ); /* 有効GID */
同時に自分のプロセスのUIDやGIDを設定できる場合があります。有効UIDで ある必要がなくなり次第実UIDにもどす場合などに使われます。
setuid( ruid ); setgid( rgid );
等となります。
自分もしくは子プロセスがシステム資源をどれほど使用しているかを調べる には、getr usageシステムコールを使います。くわしくはman getrusageを見 てください。
プロセスの優先度を落とすためにnice値を増やしたいことがあるかも知れま せん。
nice( incr );
ここでincrはnice値の増分で、0から19の間の整数です。