Provided by: manpages-ja-dev_0.5.0.0.20221215+dfsg-1_all bug

名前

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

書式

       #include <sys/types.h>
       #include <signal.h>

       int kill(pid_t pid, int sig);

   glibc 向けの機能検査マクロの要件 (feature_test_macros(7)  参照):

       kill(): _POSIX_C_SOURCE

説明

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

       pid に正の値を指定した場合、シグナル sigpid で指定された ID を持つプロセスに送られる。

       pid に 0 を指定した場合、 呼び出し元のプロセスのプロセスグループに属するすべてのプロセスに
       sig で指定したシグナルが送られる。

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

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

       If sig is 0, then no signal is  sent,  but  existence  and  permission  checks  are  still
       performed; this can be used to check for the existence of a process ID or process group ID
       that the caller is permitted to signal.

       For a process to have permission to send a signal, it must  either  be  privileged  (under
       Linux:  have  the CAP_KILL capability in the user namespace of the target process), or the
       real or effective user ID of the sending process must equal the real or saved  set-user-ID
       of the target process.  In the case of SIGCONT, it suffices when the sending and receiving
       processes belong to the same  session.   (Historically,  the  rules  were  different;  see
       NOTES.)

返り値

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

エラー

       EINVAL 無効なシグナルを指定した。

       EPERM  呼び出し元のプロセスが、受信するプロセスのいずれに対しても シグナルを送る許可を持っ
              ていない。

       ESRCH  The  target process or process group does not exist.  Note that an existing process
              might be a zombie, a process that has terminated execution, but has  not  yet  been
              wait(2)ed for.

準拠

       POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

注意

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

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

       POSIX.1  では以下の動作になることを要求している。   自分自身にシグナルを送ると、シグナルを
       送ったスレッドがそのシグナルをブロック  しておらず、他のどのスレッドもそのシグナルを受ける
       状態にもなく 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 に準拠しており、カーネル 1.3.78 以降で 適用されて
       いる。

バグ

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

関連項目

       kill(1),   _exit(2),   pidfd_send_signal(2),   signal(2),  tkill(2),  exit(3),  killpg(3),
       sigqueue(3), capabilities(7), credentials(7), signal(7)

この文書について

       この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの
       説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。