程式例
編寫一個函式,功能是殺死另一個進程:
#include<stdio.h> //printf()#include<stdlib.h> //exit()#include<unistd.h> //fork()#include<signal.h> int main(int argc, char const *argv[]){ if(argc != 2) { printf("Please input pid\n"); return 0; } int pid =1; sscanf(argv[1], "%d", &pid); if(pid > 0) { kill(pid, SIGINT); } return 0;}
Linux C
信號傳送函式—kill()
頭檔案:#include <sys/types.h>#include <signal.h>
原型: int kill(pid_t pid,int signo)
功能
向進程或進程組傳送一個信號 (成功返回 0; 否則,返回 -1 )
參數說明
pid:接收信號的進程(組)的進程號
pid>0:傳送給進程號為pid的進程
pid=0:傳送給當前進程所屬進程組裡的所有進程
pid=-1:傳送給除1號進程和自身以外的所有進程
pid<-1:傳送給屬於進程組-pid的所有進程
signo:傳送的信號值
Signo = 0:不傳送信號,可用於檢查目標進程是否存在,以及當前進程是否具有向目標進程傳送信號的許可權(root許可權的進程可以向任何進程傳送信號,非root許可權的進程只能向屬於同一個session或者同一個用戶的進程傳送信號)。
信號值 1 - 31叫做不可靠信號不支持排隊, 信號可能會丟失, 也叫做非實時信號。
34 - 64 叫做可靠信號,支持排隊, 信號不會丟失, 也叫做實時信號
比較常用的一些信號值
SIGHUP 1 A 終端掛起或者控制進程終止
SIGINT 2 A 鍵盤中斷(如break鍵被按下)
SIGQUIT 3 C 鍵盤的退出鍵被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)發出的退出指令
SIGFPE 8 C 浮點異常
SIGKILL 9 AEF Kill信號
SIGSEGV 11 C 無效的記憶體引用
SIGPIPE 13 A 管道破裂: 寫一個沒有讀連線埠的管道
SIGALRM 14 A 由alarm(2)發出的信號
SIGTERM 15 A 終止信號
SIGUSR1 30,10,16 A 用戶自定義信號1
SIGUSR2 31,12,17 A 用戶自定義信號2
SIGCHLD 20,17,18 B 子進程結束信號
SIGCONT 19,18,25 進程繼續(曾被停止的進程)
SIGSTOP 17,19,23 DEF 終止進程
SIGTSTP 18,20,24 D 控制終端(tty)上按下停止鍵
SIGTTIN 21,21,26 D 後台進程企圖從控制終端讀
SIGTTOU 22,22,27 D 後台進程企圖從控制終端寫
man手冊
SYNOPSIS
#include <signal.h>
int kill(pid_t pid, int sig);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
kill(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE
DESCRIPTION
The kill() system call can be used to send any signal to any process
group or process.