KILL(2) | Linux Programmer's Manual | KILL(2) |
名前
kill -プロセスにシグナルを送る書式
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid , int sig );
glibc 向けの機能検査マクロの要件 ( feature_test_macros(7) 参照):
説明
システムコールの 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と一致すればシグナルを送信できた。カーネル 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), tkill(2), exit(3), sigqueue(3), credentials(7), capabilities(7), signal(7)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-02-05 | Linux |