Linux系统编程05--信号1

五、信号-1

信号概念

信号编号

查询Linux系统信号编号表(Linux提供64个信号种类)

kill -l

在当前学习Linux系统编程阶段,学习前32个信号,为Linux经典信号,后32个信号是实时信号,是硬件使用的信号。其实通过kill -l查询并没有64个信号,1-31号和34-64号信号,但是通常是叫做前32和后32便记忆,其中空缺的32,33目前不讨论,还有信号是从1开始的,并不是0开始的。

jiaojian@KyLin:~/Linux/APUE/g进程通讯$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

kill命令的原理就是通过信号机制实现,kill本意并不是杀死进程,而是给指定进程发送一个信号,告诉它停止运行。信号是一种重要的操作系统机制,查询信号机制通过man 7 signal查询。

信号机制

man 7 signal

目前标准下的查询结果:

如:信号SIGHUP为其宏名,1为其值

描述 (DESCRIPTION)
       下面 列出 Linux 支持的 信号. 某些 信号 依赖于 体系结构(architecture).

       首先, POSIX.1 描述了 下列 信号.

       信号         值      动作   说明
       ─────────────────────────────────────────────────────────────────────
       SIGHUP        1       A     在控制终端上是挂起信号, 或者控制进程结束
       SIGINT        2       A     从键盘输入的中断
       SIGQUIT       3       C     从键盘输入的退出
       SIGILL        4       C     无效硬件指令
       SIGABRT       6       C     非正常终止, 可能来自 abort(3)
       SIGFPE        8       C     浮点运算例外
       SIGKILL       9      AEF    杀死进程信号
       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     终端上发出的停止信号
       SIGTTIN   21,21,26    D     后台进程试图从控制终端(tty)输入
       SIGTTOU   22,22,27    D     后台进程试图在控制终端(tty)输出
      下面的 信号 定义 在 SUSv2 中, 而 POSIX.1 没有 定义.

       信号           值      动作   说明
       ───────────────────────────────────────────────────────────────────
       SIGBUS      10,7,10     C     总线错误 (不正确的内存访问)
       SIGPOLL                 A     I/O就绪事件 (Sys V). 等同于SIGIO
       SIGPROF     27,27,29    A     系统资源定时器(Profiling timer)超时
       SIGSYS      12,-,12     C     用错误参数调用系统例程 (SVID)
       SIGTRAP        5        C     跟踪/断点自陷
       SIGURG      16,23,21    B     套接口上出现 urgent 情况 (4.2 BSD)
       SIGVTALRM   26,26,28    A     虚拟超时时钟 (4.2 BSD)
       SIGXCPU     24,24,30    C     超过了CPU时间限制 (4.2 BSD)
       SIGXFSZ     25,25,31    C     超过了文件大小限制 (4.2 BSD)

       (这里的  SIGSYS, SIGXCPU, SIGXFSZ, 以及 某些 系统上 的 SIGBUS, Linux 的 缺省动作
       (到2.3.27版) 是 A(结束), 而 SUSv2 声明是 C(结束且核心转储).)

       下面 是 其他 几个 信号.
       信号           值      动作   说明
       ──────────────────────────────────────────────────────────────
       SIGIOT         6        C     IOT 自陷. 等同于 SIGABRT
       SIGEMT       7,-,7
       SIGSTKFLT    -,16,-     A     协处理器堆栈错误

       SIGIO       23,29,22    A     I/O 有效信号 (4.2 BSD)
       SIGCLD       -,-,18           等同于 SIGCHLD
       SIGPWR      29,30,19    A     电源无效 (System V)
       SIGINFO      29,-,-           等同于 SIGPWR
       SIGLOST      -,-,-      A     文件锁丢失
       SIGWINCH    28,28,20    B     窗口大小调整信号 (4.3 BSD, Sun)
       SIGUNUSED    -,31,-     A     未使用的信号 (将成为 SIGSYS)

       这里的 - 指 信号 不存在; 可能 给出 三个值, 第一个值 一般 用于 alpha 和 sparc, 中
       间的值  用于  i386,  ppc  和  sh,  最后一个  是 mips 的.  信号29 在 alpha机上 是
       SIGINFO / SIGPWR , 而在 sparc机上 是 SIGLOST

       "动作(Action)"栏 的 字母 有 下列 含义:

       A      缺省动作是结束(terminate终止)进程.

       B      缺省动作是忽略这个信号.

       C      缺省动作是结束进程, 并且核心转储.

       D      缺省动作是停止(stop暂停并非终止)进程.
       E      信号不能被捕获.

       F      信号不能被忽略.

       (译注: 这里 "结束" 指 进程 终止 并 释放资源, "停止" 指 进程 停止 运行, 但是 资源
       没有 释放, 有可能 继续 运行.)

遵循 (CONFORMING TO)
       POSIX.1

​ 另一种结果(First the signals described in the original POSIX.1-1990 standard.),1-1990标准:

动作Active含义:

Term Default action is to terminate the process.

Ign Default action is to ignore the signal.

Core Default action is to terminate the process and dump core (see core(5)).

Stop Default action is to stop the process.

Cont Default action is to continue the process if it is currently stopped.
Signal Value Action Comment
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:

Term表示终止当前进程.
Core表示终止当前进程并且Core Dump(Core Dump 用于gdb调试).
Ign表示忽略该信号.
Stop表示停止当前进程.
Cont表示继续执行先前停止的进程.

表中最后一列是简要介绍,说明什么条件下产生该信号。

信号产生的方式、种类
1.终端下特殊快捷键产生信号,发送给当前shell的前台进程。
ctl+c SIGINT   相当于发送SIGINT,终止当前进程
ctl+z SIGTSTP  相当于发送SIGTSTP信号,其中sig后的T表示的是终端意思,这个信号是暂停进程,输入fg 1又启动该进程并且是前台运行,bg 1表示启动并后台运行
ctl+\ SIGQUIT  相当于发送SIGQUIT信号,退出当前进程

终端可以通过快捷键来发送信号,如上面三个

2.硬件异常
  • 除0操作(信号8【SIGFPE】:浮点数另外,cpu不能除0)
  • 访问非法内存(段错误,信号11【SIGSEGV】,非法操作内存)

上面两个都是非法操作硬件才能错误,当硬件异常时,操作系统会给该进程发送相应信号

3.kill函数或kill命令(函数发送信号方式)

kill() 函数,向指定进程或进程组内所有进程发送信号

int kill(pid_t pid, int sig)
参数:
pid > 0
sig发送给ID为pid的进程
pid == 0,
sig发送给与发送进程处于同一组的所有进程,即如果一个父进程fork()出10个子进程,此时父进程kill(0,sig),则向这10个进程都发送该信号
pid < 0
sig发送给组ID为|-pid|的进程即向指定进程组内所有进程发送信号,并且发送进程具有向其发送信号的权限
pid == -1
将信号sig发送给发送进程有权限向他们发送信号的系统上的所有进程发送信号,即向该进程有权限发送信号的所有进程发送信号
sig为信号编号,指定信号
sig为0时,用于检测,特定为pid进程是否存在,如不存在,返回-1。
return:
	成功返回0,失败返回-1;

raise() 函数,向自己发送信号

int raise(int sig)  自己向自己发信号
    参数sig为信号编号或者宏名
void abort(void)    自己向自己发送6:SIGABRT信号,与raise(6)等价
4.某种软件条件触发信号

如:定时器,每个进程有且只有一个定时器alarm。

unsigned int alarm(unsigned int seconds)
精度为秒s
参数:
	seconds,为设定的定时时长,
return:
	距离定时结束时长,假设开始定时100S,到了40S时让定时终断或者重新定时,则返回60

定时器函数alarm()当定时时间到达时,会向当前进程发送一个14:SIGALRM信号

下面代码是一个简单的测试当前机器一秒运行次数,体现机器性能

#include <stdio.h>
#include <unistd.h>


int main()

{
    int count;
    alarm(2);
    for(count =0; 1;count++)
    {
        printf("count = %d\n",count);
    }
    return 0;
}

​ alarm()函数与sleep()函数的区别是:sleep()函数是当进程运行到sleep时睡眠,进程进入阻塞态,不会向下继续执行,而alarm()则是当进程运行到alarm函数时,启动计时器,进程继续向下运行,当计时完成,给自己发送14号:SIGALRM信号,进程终止。

比如:前面管道有一个:管道读端关闭,写端写数据会给自己发送一个13:SIGPIPE信号

信号产生运原因

下表为前32个信号产生的原因与场景:

1) SIGHUP:当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程
2)SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动
作为终止里程。
3)SIGQUIT:当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信
号。默认动作为终止进程。
4)SIGILL:CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件
5)SIGTRAP:该信号由断点指令或其他 trap指令产生。默认动作为终止里程 并产生core文件。
6 ) SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。
7)SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。
8)SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默
认动作为终止进程并产生core文件。
9)SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可
以杀死任何进程的方法。
10)SIGUSE1:用户定义 的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。
11)SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。
12)SIGUSR2:这是另外一个用户自定义信号 ,程序员可以在程序中定义 并使用该信号。默认动作为终止进程。1
13)SIGPIPE:Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。
14) SIGALRM:定时器超时,超时的时间 由系统调用alarm设置。默认动作为终止进程。
15)SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行
shell命令Kill时,缺省产生这个信号。默认动作为终止进程。
16)SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。
17)SIGCONT:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为终止进程。
18)SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。
19)SIGTSTP:停止进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。
21)SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。
22)SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据
到达,默认动作为忽略该信号。
23)SIGXFSZ:进程执行时间超过了分配给该进程的CPU时间 ,系统产生该信号并发送给该进程。默认动作为终止
进程。
24)SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。
25)SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默
认动作为终止进程。
26)SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进
程。
27)SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。
28)SIGIO:此信号向进程指示发出了一个异步IO事件。默认动作为忽略。
29)SIGPWR:关机。默认动作为终止进程。
30)SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。
31)SIGRTMIN~(64)SIGRTMAX:LINUX的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信
号的默认动作都为终止进程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值