kill() - プロセスへのシグナルの送信

標準

標準/拡張機能 C/C++ 依存項目
POSIX.1
XPG4
XPG4.2

Single UNIX Specification、バージョン 3
両方
POSIX(ON)

形式

#define _POSIX_SOURCE
#include <signal.h>

int kill(pid_t pid, int sig);

機能説明

プロセスまたはプロセス・グループにシグナルを送信します。プロセスは、送信側の実ユーザー ID または有効なユーザー ID が、意図される受信側の実ユーザー ID または有効なユーザー ID と一致する場合に、シグナルを送信する許可を持ちます。プロセスは、適切な権限を持っている場合にも、シグナルを送信することができます。_POSIX_SAVED_IDS が unistd.h ヘッダー・ファイル内に定義されている場合、意図される受信側の保管された設定ユーザー ID が、有効なユーザー ID の代わりに チェックされます。

ユーザー ID にかかわらず、プロセスは、送信側と同じセッション (同じセッション ID) の メンバーであるプロセスに対しては、いつでも SIGCONT シグナルを 送信できます。

signal() または sigaction() を使用すると、kill() が呼び出された場合の シグナルの対処方法を指定することができます。

プロセスは kill() を使用して、プロセス自身にシグナルを送信できます。シグナルがブロックも無視もされない場合、kill() が戻る前に、保留中でブロックされていないシグナルが 1 つ以上送信側へ送達されます。保留中のブロックされていないシグナルがほかにない場合、届けられるシグナルは sig になります。

pid を使って、これらのプロセスを指定することができます。
pid_t pid;
呼び出し側がシグナルを送信したいプロセスを指定します。
  • pid が 0 より大きい場合、kill() はそのシグナルを pid と等しい ID のプロセスに送信します。
  • pid が 0 に等しい場合、kill() はそのシグナルを プロセス・グループ ID が送信側のものと一致するプロセスすべてに送信しますが、送信側がシグナルを送信する権限を持っていないプロセスに対しては、シグナルは送信されません。
  • pid が -1 の場合、kill() は -1 を戻します。
  • XPG4.2 の特殊な動作: pid が -1 の場合、kill() は、送信側がシグナルを送信する権限を持っていないプロセスを除くすべてのプロセスに、シグナル sig を送信します。
  • pid が -1 未満の場合、kill() はそのシグナルを プロセス・グループ ID が pid の絶対値と等しいプロセスすべて に送信しますが、送信側がシグナルを送信する権限を持っていないプロセス に対しては、シグナルは送信されません。
int sig;
pid によって指定されるプロセスに対して送信されるシグナルです (シグナルのリストは、表 1 を参照してください)。 これは 0 または signal.h ヘッダー・ファイルに定義されているシグナルの いずれかでなくてはいけません。sig が 0 の場合、kill() はエラー検査を行いますが、シグナルを送信しません。pid 引数が正しいかどうかチェックするために、sig を 0 にすることができます。

この関数がサポートされるのは、POSIX プログラムだけです。 SIGIOERR を渡すために使用できます。

使用上の注意

この関数では、SIGTHSTOP および SIGTHCONT シグナルの使用はサポートされていません。

戻り値

kill() は、pid が指定するプロセスのいずれかに sig を送信する許可を持っている場合、0 を戻します。

kill() がシグナルの送信に失敗した場合は、-1 が戻され、errno が次のいずれかの値に設定されます。
エラー・コード
説明
EINVAL
sig の値が正しくない、またはサポートされたシグナルの番号 ではありません。
EPERM
呼び出し側が、pid によって指定されるどのプロセスに対してもシグナルを送信する許可を持っていません。
ESRCH
pid に対応するプロセスまたはプロセス・グループが存在しません。

CELEBK01
/* CELEBK01 */
#define _POSIX_SOURCE
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h> /*FIX: used to be <wait.h>*/

main() {
  sigset_t sigset;
  int    p[2], status;
  char   c='z';
  pid_t  pid;

  if (pipe(p) != 0)
    perror("pipe() error");
  else {
    if ((pid = fork()) == 0) {
      sigemptyset(&sigset);
      puts("child is letting parent know he's ready for signal");
      write(p[1], &c, 1);
      puts("child is waiting for signal");
      sigsuspend(&sigset);
      exit(0);
    }

    puts("parent is waiting for child to say he's ready for signal");
    read(p[0], &c, 1);
    puts("child has told parent he's ready for signal");

    kill(pid, SIGTERM);

    wait(&status);
    if (WIFSIGNALED(status))
      if (WTERMSIG(status) == SIGTERM)
        puts("child was ended with a SIGTERM");
      else
        printf("child was ended with a %d signal¥n", WTERMSIG(status));
    else puts("child was not ended with a signal");

    close(p[0]);
    close(p[1]);
  }
}
出力:
parent is waiting for child to say he's ready for signal
child is letting parent know he's ready for signal
child is waiting for signal
child has told parent he's ready for signal
child was ended with a SIGTERM

関連情報