kill

Autres langues

Langue: ja

Version: 2004-06-24 (mandriva - 01/05/08)

Autres sections - même nom

Section: 2 (Appels système)

名前

kill - プロセスにシグナルを送る

書式

 #include <sys/types.h>
 
#include <signal.h> int kill(pid_t pid, int sig);

説明

システムコールの kill() は、任意のプロセス・グループもしくはプロセスにシグナルを 送るのに使われる。

pid に正の値を指定した場合、 sig で指定したシグナルが pid のプロセスに送られる。

pid に 0 を指定した場合、 sig で指定したシグナルが 送ろうとしたプロセスと同じプロセス・グループに属するすべての プロセスに送られる。

pid に -1 を指定した場合、 sig で指定したシグナルが、 呼び出し元のプロセスがシグナルを送る許可を持つ全てのプロセスに 送られる。但し、プロセス番号 1 (init) へはシグナルは送られない。 以下の関連部分も参照のこと。

pid に -1 より小さな値を指定した場合、 -pid の プロセス・グループに属するすべてのプロセスに sig で 指定したシグナルが送られる。

sig に 0 を指定した場合、シグナルは送られないが、 エラーのチェックは行われる。

あるプロセスがシグナルを送る許可を持つには、 そのプロセスが特権 (Linux では CAP_KILL ケーパビリティ) を持つプロセスであるか、シグナルを送る側のプロセスの 実UID か実効UID が受ける側のプロセスの実 set-UID か保存 (saved) set-UID が一致していなければならない。 SIGCONT の場合は、シグナルを送信するプロセスと受信するプロセスが 同じセッションに所属していれば十分である。

返り値

成功した場合 (少なくとも一つのシグナルが送信された場合)、 0 が返される。エラーの場合 -1 が返され、 errno が適切に設定される。

エラー

EINVAL
無効なシグナルを指定した。
EPERM
プロセスが、受信するプロセスのいずれに対しても シグナルを送る許可を持っていない。
ESRCH
指定したプロセスまたはプロセス・グループが存在しなかった。 ゾンビプロセスは存在するプロセスとしてみなされる。 ゾンビプロセスとはすでに処理は終了しているが、親プロセスによる wait() 処理が行われていないプロセスのことである。

準拠

SVr4, 4.3BSD, POSIX.1-2001

注意

プロセス番号 1 の init プロセスに送ることができるシグナルは、 init が明示的にシグナルハンドラを設定したシグナルだけである。 こうなっているのは、誤ってシステムをダウンさせないようにするためである。

POSIX.1-2001 では、 kill(-1,sig) が 現在のプロセスがシグナルを送ることが出来るプロセス全てに sig を送ることを要求している。 但し、システム実装時に定められたシステムプロセスは シグナルの送信対象から除外される。 Linux では、プロセスが自分自身にシグナルを送れるようになっているが、 Linux の kill(-1,sig) はカレントプロセスにはシグナルを送らない。

POSIX.1-2001 では以下の動作になることを要求している。 自分自身にシグナルを送ると、シグナルを送ったスレッドがそのシグナルをブロック しておらず、他のどのスレッドもそのシグナルを受ける状態にもなく sigwait(3) でそのシグナルを待ってもいない場合、 kill() の前に少なくとも一つのブロックされていない シグナルがシグナルを送ったスレッドに配送されなければならない。

Linux での注意

Linux では、特権のないプロセスが他のプロセスにシグナルを送信するために 必要な権限についてのルールが、カーネルバージョンにより違っている。 カーネル 1.0 から 1.2.2 では、送信側の実効ユーザーID が受信側の 実効ユーザー IDと一致すればシグナルを送信できた。 カーネル 1.2.3 から 1.3.77では、送信側の実効ユーザーID が受信側の 実ユーザーID か実効ユーザーID のいずれかと一致すればシグナルを送信できた。 現在のルールは、POSIX.1-2001 に準拠しており、カーネル 1.3.78 以降で 適用されている。

バグ

バージョン 2.6.7 以前の 2.6 系のカーネルには、 プロセスグループにシグナルを送ったときに、 呼び出し元のプロセスがプロセスグループの (全メンバーではなく) 一部のメンバー に対してのみシグナルを送る許可を持っている場合に、 kill() がエラー EPERM で失敗するというバグがある。 このエラーが返るにもかかわらず、そのシグナルは呼び出し元が シグナルを送る許可を持つ全てのプロセスへ送られる。

関連項目

_exit(2), killpg(2), signal(2), sigqueue(2), tkill(2), exit(3), capabilities(7), signal(7)