信号的基础知识

目录

发送信号

信号处理方式 

Linux信号

中断系统调用

信号函数 

signal系统调用 

sigaction系统调用 

信号集 

信号集函数 

 进程信号掩码

被挂起的信号 

网络编程相关信号 

SIGHUP 

SIGPIPE 

SIGURG 


Linux信号可由如下条件产生:

  • 对于前台进程,用户可以通过输入特殊的终端字符来给它发送信号。比如输入Ctrl+C通常会给进程发送一个中断信号。
  • 系统异常。比如浮点异常和非法内存段访问。
  • 系统状态变化。比如alarm定时器到期将引起SIGALRM信号。
  • 运行kill命令或调用kill函数,“kill -l”可以列出系统中的所有信号。“kill -SIGTERM 进程号”来发送信号给特定的进程

服务器程序必须处理(或至少忽略)。一些常见的信号,以免异常终止。

发送信号

#include<sys/types.h>

#include<signal.h>

int kill(pid_t pid , int sig);

该函数把信号sig发送给目标进程;目标进程由pid参数指定,其可能的取值及含义如表所示。

pid参数 含义
pid>0 信号发送给PID为pid的进程
pid=0 信号发送给本进程组内的其他进程
pid= -1 信号发送给除init进程外的所有进程,但发送者需要拥有对目标进程发送信号的权限
pid< -1 信号发送给组ID为-pid的进程组中的所有成员

Linux定义的信号都大于0,如果sig取值为0,则kill函数不发送任何信号。但将sig设置为0可以用来检测目标进程或进程组是否存在,因为检查工作总是在信号发送之前就执行。不过这种检测方式是不可靠的。一方面由于进程PID的回绕,可能导致被检测的PID不是我们期望的进程PID;另一方面,这种检测方法不是原子操作。

该函数成功时返回0,失败则返回-1并设置errno。几种可能的errno如表所示:

errno 含义
EINVAL 无效的信号
EPERM 该进程没有权限发送信号给任何一个目标进程
ESRCH 目标进程或进程组不存在

raise()函数

raise()函数主要用于将信号发送给当前进程:

#include<signal.h>

int raise(int sig);

sig为发送信号类型的编号

alarm()函数

alarm()函数主要用于为发送的信号设定一个时间警告,使系统在设定的时间之后发送信号:

#include<unistd.h>

unsigned int alarm(unsigned int seconds); 

参数seconds为设定的时间值。如果seconds设置为0值,那么alarm()函数设置的警告时钟将无效。alarm()函数安排在second

时间之后,发送一个信号SIGALRM给进程。默认情况下,进程收到SIGALRM信号会终止运行。

信号处理方式 

目标进程在收到信号时,需要定义一个接收函数来处理之。信号处理函数的原型如下:

#include<signal.h>

typedef void (*__sighandler_t) (int);

信号处理函数只带有一个整形参数,该参数用来指示信号类型。信号处理函数应该是可重入的,否则很容易引发一些竞态条件。所以在信号处理函数中严禁调用一些不安全的函数。 

除了用户自定义信号处理函数外,bits/signum.h头文件中还定义了信号的两种其他处理方式——SIG_IGN和SIG_DEL:

#include<bits/signum.h>

#define SIG_DFL((__sighandler_t) 0)

#define SIG_IGN((__sighandler_t) 1)

SIG_IGN表示忽略目标信号,SIG_DFL表示使用信号的默认处理方式。信号的默认处理方式有如下几种:结束进程(Term)、忽略信号(Ign)、结束进程并生成核心转储文件(Core)、暂停进程(Stop),以及继续进程(Cont)。 

Linux信号

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值