linux中的信号

1、什么是信号

信号(IPC)最初是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。简单来说信号是操作系统(内核)响应某些条件而产生的一个事件(给进程)。进程之间无法通信,可以使用信号来解决。

2、信号如何产生

信号时由于某些错误条件而生成的,如内存段冲突,浮点处理器错误或非法指令等。他们由shell和终端处理器生成来引起中断,他们还可以作为在进程中传递消息或修改行为的一种方式,明确地由一个进程发送给另外一个进程。

3、linux中常用信号

信号的名称是在头文件 signal.h里定义的

信号名称 描述
SIGABORT 进程停止运行
SIGALRM 警告钟
SIGFPE 浮点运算例外
SIGHUP 系统挂断
SIGILL 非法指令
SIGINT 终端中断
SIGKILL 停止进程(此信号不能被忽略或捕获)
SIGPIPE 向没有读者的管道
SIGSEGV 无效内存段访问
SIGQUIT 终端退出ctrl+\
SIGTERM 正常终止
SIGUSR1 用户定义信号1
SIGUSR2 用户定义信号2
SIGCHLD 子进程已经停止或退出
SIGCONT 如果被停止则继续执行
SIGSTOP 停止执行
SIGTSTP 终端停止信号
SIGTOUT 后台进程请求进行写操作
SIGTTIN 后台进程请求进行读操作

4、信号的本质和内核处理过程

4.1 信号:内核发,进程收

中断: 硬件/进程发,内核收 信号:1. 内核发,进程收;2. 进程发,(其他或自己)进程收

4.2 信号的本质(进程的软中断)

信号的本质是软件层次上对中断的一种模拟(软中断)。signal机制可以被理解成进程的软中断 它是一种异步通信的处理机制(进程不知道信号何时到来)

4.3 信号处理流程

操作系统给进程发送信号,本质上是给进程的task_struct中写入数据,修改相应的task_struct字段(信号域的信号位图),然后进程在合适的时间去处理所接受的信号。

1.这里的合适的时间:可以理解成从内核态返回用户态时 2.进程控制块中设计了一个signal的位图信息。其中的每位与具体的signal相对应,这与中断机制是保持一致的。

4.3.1 例子说明(信号处理流程)

1.假设用户启动一个交互式的前台进程,然后输入ctrl+c结束它,系统通过键盘产生一个硬件中断。 2.cpu暂停用户空间的代码,cpu从用户态切换至内核态处理中断 3.系统驱动程序将ctlr+c解释为一个SIGINT信号,并将其记在该进程的task_struct中的信号位上; 4.当某时刻进程从内核态返回用户态继续执行之前,检查task_struct中的信号域,SIGINT信号的默认处理动作为终止进程,所以直接终止进程而不再返回到它的用户空间代码。

5、信号的使用

进程间效果,可以携带少量int数据进行传递。

5.1信号发送函数

5.1.1 kill()函数

1.kill功能:进程可以通过kill函数向包括它本身在内的其他进程发送一个信号

  1. 函数原型:

    int kill(pid_t pid,int sig)

    3.参数:

如果pid大于零,那么kill函数发送信号号码sig给进程pid。 如果pid小于零,那么kill发送信号sig给进程组abs(pid)中的每个进程。 4.返回值:成功返回0;失败返回-1;

5、头文件

#include <sys/types.h> #include <signal.h>

kill需要与signal()一起使用。

kill中的信号

31号前为不可靠信号,34号以后为可靠信号。32 33没有是为了区分可靠信号和不可靠信号。Kill不是杀死而是发送 信号给XXX进程。

SIGUSR1,SIGUSR2 预留给编程人员进行使用,无意义。是用户定义信号1,尽量不要占用其他信号。

可靠信号和不可靠信号:

不可靠信号连续发送有可能会造成信号丢失。

简单来说,因为信号连续发送的时候,如果前面以及收到信号并且在处理,就不会处理收到的信号。

可靠信号连续发送不会造成信号的丢失。

这是这两者的区别。

例子

 

运行结果:

5.1.2 sigqueue函数

函数作用:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与sigaction()配合使用 sigqueue可以将数据从一个进程发送给另一个进程; 前2个参数与kill一样,只是它不能向进程组发送信号,pid只能是大于0的值,

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值