一、信号的产生
1、终端按键产生信号
Ctrl + c 2) SIGINT (终止/中断) “INT” --------------- Interrupt
Ctrl + z 20)SIGTSTP(暂停/停止) "T" -------------- Terminal
Ctrl + \ 3)SIGQUIT(退出)
二、硬件产生异常信号
除 0 操作 8) SIGFPE (浮点数除外) "F" --------- float 浮点数
非法访问内存 11)SIGSEGV(段错误)
总线错误 7) SIGBUS
1、kill 函数 / 命令产生信号
kill 命令产生信号: kill -SIGKILL pid
kill 函数 : 给指定进程发送指定信号(不一定杀死)。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
返回值:
成功: 返回 0; 失败:返回 -1 ( ID 非法,信号非法,普通用户杀 init 进程等权级问题),设置 errno
参数:
sig : 不推荐直接使用数字,应使用宏名,因为不同的操作系统,信号的编号肯能不同,但名称一致。
pid > 0 : 发送信号给指定的进程
pid = 0 : 发送信号给与调用 kill 函数进程属于同一进程组的所有进程。
pid < 0 : 取 [pid] 发送给对应的进程。
pid = -1 : 发送给进程有权限发送的系统中所有进程。
进程组: 每个进程都属于一个进程组,进程组是一个或多个进程集合,它们相互关联,共同完成一个实体任务,每一个进程都有一个进程组组长,默认进程组 ID 与
进程组长 ID相同。
权限保护: super 用户(root)可以发送信号给任意用户,普通用户是不能向系统用户发送信号的。 kill -9 (root 用户的 pid )是不可以的。同样,普通用户也不
能向其他用户发送信号,终止其进程。只能向自己创建的进程发送信号。普通用户基本规则:发送者实际或有效用户 ID == 接收者实际或有效用户 ID 。
2、raise 和 abort 函数
raise 函数:给当前进程发送指定信号(自己给自己发) raise(signo) == kill(getpid(),signo);
int raise(int signo); 成功:0 失败: -1
abort 函数:给自己发送异常终止信号,6) SIGABRT 信号,进程收到该信号,默认动作终止。
#include<unistd.h>
#include<sys/types.h>
#include<signal.h>
#include<stdlib.h>
#include<stdio.h>
#define N 5
int main(void)
{
pid_t pid,q;
int i;
// raise(SIGINT);
abort();
for( i=0; i<N; i++ )
{
pid = fork();
if( pid == 0 )
break;
if( i==2 )
q=pid;
}
if( i<5 )
{
while(1)
{