1. 函数kill
#include<signal.h>
int kill(pid_t pid, int signo); //signo:信号名
两个函数返回值:若成功,返回0, 若出错,返回-1
分析:
- pid > 0: 发送信号给指定的进程
- pid = 0: 发送信号给调用kill函数进程属于同一个进程组的所有进程
- pid < 0:取pid绝对值发给对应进程组。
- pid = -1:发送给有权限发送的系统中所有进程。
注意:
- 进程组:每个进程都属于一个进程组,进程组是一个或多个进程的集合, 它们相互关联,共同完成一个实体任务。每个进程组都有一个进程组长,默认进程组ID与进程组长ID相同。
- 权限保护:super用户(root)可以发送信号给任意用户,普通用户不能像系统发送信号的,kill -9(root用户的pid)是不可以的,同样,普通用户也不能向其他普通用户发送信号,终止进程。只能向自己进程发送信号,普通的用户基本规则:发送者实际或有效用户ID == 接受者实际或有效用户ID
2. 函数raise
#include<signal.h>
int raise(int signo); //signo:信号名
两个函数返回值:若成功,返回0, 若出错,返回-1
分析:
- 给当前进程发送指定信号(自己给自己发)raise(signo) == kill(getpid(), signo))
3. 函数abort
#include<stdlib.h>
void abort(void);
此函数不返回值
分析:
- 给自己发送异常终止信号 6) SIGABRT信号,终止并产生core文件
测试代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#define N 5
int main() {
int i;
pid_t pid, q;
for(i = 0; i < N; i++) {
pid = fork();
if(pid == 0)
break;
if(i == 2)
q = pid;
}
if(i < 5) {
while(1) {
printf("I'm child %d, getpid = %d\n", i, getpid());
sleep(1);
}
} else {
sleep(1);
kill(q, SIGKILL);
while(1);
}
return 0;
}
输出结果: