書式
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
説明
システムコールの kill() は、任意のプロセス・グループもしくはプロセスにシグナルを 送るのに使われる。pid に正の値を指定した場合、シグナル sig が pid で指定された ID を持つプロセスに送られる。
pid に 0 を指定した場合、 呼び出し元のプロセスのプロセス・グループに属するすべてのプロセスに sig で指定したシグナルが送られる。
pid に -1 を指定した場合、 sig で指定したシグナルが、 呼び出し元のプロセスがシグナルを送る許可を持つ全てのプロセスに 送られる。但し、プロセス番号 1 (init) へはシグナルは送られない。 以下の関連部分も参照のこと。
pid に -1 より小さな値を指定した場合、 ID が -pid のプロセス・グループに属するすべてのプロセスに sig で指定したシグナルが送られる。
sig に 0 を指定した場合、シグナルは送られないが、 エラーのチェックは行われる。これを使って、プロセス ID や プロセスグループ ID の存在確認を行うことができる。
プロセスがシグナルを送信する許可を持つためには、 プロセスが特権 (Linux では CAP_KILL ケーパビリティ (capability)) を持つか、 送信元プロセスの実ユーザー ID または実効ユーザー ID が 送信先プロセスの実 set-user-ID または保存 set-user-ID と 等しくなければならない。 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 と一致するか、 送信側の実ユーザー ID が送信対象の実ユーザー ID と一致すれば、 シグナルを送信できた。 カーネル 1.2.3 から 1.3.77では、送信側の実効ユーザー ID が送信対象の実ユーザー ID か実効ユーザー ID のいずれかと一致すればシグナルを送信できた。 現在のルールは、POSIX.1-2001 に準拠しており、カーネル 1.3.78 以降で 適用されている。バグ
バージョン 2.6.7 以前の 2.6 系のカーネルには、 プロセスグループにシグナルを送ったときに、 呼び出し元のプロセスがプロセスグループの (全メンバーではなく) 一部のメンバーに対してのみシグナルを送る許可を持っていない場合に、 kill() がエラー EPERM で失敗するというバグがある。 このエラーが返るにもかかわらず、そのシグナルは呼び出し元が シグナルを送る許可を持つ全てのプロセスへ送られる。この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部である。 プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。