linux信号(signal)

一、signal本质

软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟。

二、signal各种类型

处理动作一项中的字母含义如下
A 缺省的动作是终止进程
B 缺省的动作是忽略此信号
C 缺省的动作是终止进程并进行内核映像转储(dump core)
D 缺省的动作是停止进程
E 信号不能被捕获
F 信号不能被忽略

POSIX.1中列出的信号:

信号 值 处理动作 发出信号的原因
----------------------------------------------------------------------
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 后台进程企图从控制终端写 

没在POSIX.1中列出,而在SUSv2列出:

SIGBUS 10,7,10 C 总线错误(错误的内存访问)
SIGPOLL A Sys V定义的Pollable事件,与SIGIO同义
SIGPROF 27,27,29 A Profiling定时器到
SIGSYS 12,-,12 C 无效的系统调用 (SVID)
SIGTRAP 5 C 跟踪/断点捕获
SIGURG 16,23,21 B Socket出现紧急条件(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) 

下面是其它的一些信号:

SIGIOT 6 C IO捕获指令,与SIGABRT同义
SIGEMT 7,-,7
SIGSTKFLT -,16,- A 协处理器堆栈错误
SIGIO 23,29,22 A 某I/O操作现在可以进行了(4.2 BSD)
SIGCLD -,-,18 A 与SIGCHLD同义
SIGPWR 29,30,19 A 电源故障(System V)
SIGINFO 29,-,- A 与SIGPWR同义
SIGLOST -,-,- A 文件锁丢失
SIGWINCH 28,28,20 B 窗口大小改变(4.3 BSD, Sun)
SIGUNUSED -,31,- A 未使用的信号(will be SIGSYS)

三、信号处理函数

1. alarm(设置信号传送闹钟)

unsigned int alarm(unsigned int seconds);

函数说明: alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
返回值 : 返回之前闹钟的剩余秒数,如果之前未设闹钟则返回0。

2.kill(传送信号给指定的进程)

int kill(pid_t pid,int sig);

函数说明: kill()可以用来送参数sig指定的信号给参数pid指定的进程。参数pid有几种情况:
pid>0 将信号传给进程识别码为pid 的进程。
pid=0 将信号传给和目前进程相同进程组的所有进程
pid=-1 将信号广播传送给系统内所有的进程
pid<0 将信号传给进程组识别码为pid绝对值的所有进程
参数sig代表的信号编号可参考附录D

返回值 : 执行成功则返回0,如果有错误则返回-1。

3.pause(让进程暂停直到信号出现)

int pause(void);

函数说明: pause()会令目前的进程暂停(进入睡眠状态),直到被信号(signal)所中断。
返回值 : 只返回-1。

4.sigaction(查询或设置信号处理方式)

int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

函数说明: sigaction()会依参数signum指定的信号编号来设置该信号的处理函数。参数signum可以指定SIGKILL和SIGSTOP以外的所有信号。
返回值 : 执行成功则返回0,如果有错误则返回-1。

5.sigaddset(增加一个信号至信号集)

int sigaddset(sigset_t *set,int signum);

函数说明: sigaddset()用来将参数signum 代表的信号加入至参数set 信号集里。
返回值 : 执行成功则返回0,如果有错误则返回-1。

6. sigdelset(从信号集里删除一个信号)

int sigdelset(sigset_t * set,int signum);

函数说明: sigdelset()用来将参数signum代表的信号从参数set信号集里删除。
返回值 : 执行成功则返回0,如果有错误则返回-1。

7. sigemptyset(初始化信号集)

int sigemptyset(sigset_t *set);

函数说明: sigemptyset()用来将参数set信号集初始化并清空。
返回值 : 执行成功则返回0,如果有错误则返回-1。

8. sigfillset(将所有信号加入至信号集)

int sigfillset(sigset_t * set);

函数说明: sigfillset()用来将参数set信号集初始化,然后把所有的信号加入到此信号集里。
返回值 : 执行成功则返回0,如果有错误则返回-1。

9. sigismember(测试某个信号是否已加入至信号集里)

int sigismember(const sigset_t *set,int signum);

函数说明: sigismember()用来测试参数signum 代表的信号是否已加入至参数set信号集里。如果信号集里已有该信号则返回1,否则返回0。
返回值 : 信号集已有该信号则返回1,没有则返回0。如果有错误则返回-1。

10. signal(设置信号处理方式)

void (*signal(int signum,void(* handler)(int)))(int);
如果该函数原型不容易理解的话,可以参考下面的分解方式来理解:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler)); 

函数说明: signal()会依参数signum 指定的信号编号来设置该信号的处理函数。当指定的信号到达时就会跳转到参数handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常数之一:
SIG_IGN 忽略参数signum指定的信号。
SIG_DFL 将参数signum 指定的信号重设为核心预设的信号处理方式。
关于信号的编号和说明,请参考附录D
返回值 : 返回先前的信号处理函数指针,如果有错误则返回SIG_ERR (-1)。

11. sigpending(查询被搁置的信号)

int sigpending(sigset_t *set);

函数说明: sigpending()会将被搁置的信号集合由参数set指针返回。
返回值执: 行成功则返回0,如果有错误则返回-1。

12. sigprocmask(查询或设置信号遮罩)

int sigprocmask(int how,const sigset_t *set,sigset_t * oldset);

函数说明: sigprocmask()可以用来改变目前的信号遮罩,其操作依参数how来决定
SIG_BLOCK 新的信号遮罩由目前的信号遮罩和参数set 指定的信号遮罩作联集
SIG_UNBLOCK 将目前的信号遮罩删除掉参数set指定的信号遮罩
SIG_SETMASK 将目前的信号遮罩设成参数set指定的信号遮罩。
如果参数oldset不是NULL指针,那么目前的信号遮罩会由此指针返回。
返回值 : 执行成功则返回0,如果有错误则返回-1。

13. sleep(让进程暂停执行一段时间)

unsigned int sleep(unsigned int seconds);

函数说明: sleep()会令目前的进程暂停,直到达到参数seconds 所指定的时间,或是被信号所中断。
返回值 : 若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值