赞
踩
信号(IPC)最初是UNIX系统响应某些状况而产生的事件,进程在接收到信号时会采取相应的行动。简单来说信号是操作系统(内核)响应某些条件而产生的一个事件(给进程)。进程之间无法通信,可以使用信号来解决。
信号时由于某些错误条件而生成的,如内存段冲突,浮点处理器错误或非法指令等。他们由shell和终端处理器生成来引起中断,他们还可以作为在进程中传递消息或修改行为的一种方式,明确地由一个进程发送给另外一个进程。
信号的名称是在头文件 signal.h里定义的
信号名称 | 描述 |
---|---|
SIGABORT | 进程停止运行 |
SIGALRM | 警告钟 |
SIGFPE | 浮点运算例外 |
SIGHUP | 系统挂断 |
SIGILL | 非法指令 |
SIGINT | 终端中断 |
SIGKILL | 停止进程(此信号不能被忽略或捕获) |
SIGPIPE | 向没有读者的管道 |
SIGSEGV | 无效内存段访问 |
SIGQUIT | 终端退出ctrl+\ |
SIGTERM | 正常终止 |
SIGUSR1 | 用户定义信号1 |
SIGUSR2 | 用户定义信号2 |
SIGCHLD | 子进程已经停止或退出 |
SIGCONT | 如果被停止则继续执行 |
SIGSTOP | 停止执行 |
SIGTSTP | 终端停止信号 |
SIGTOUT | 后台进程请求进行写操作 |
SIGTTIN | 后台进程请求进行读操作 |
中断: 硬件/进程发,内核收 信号:1. 内核发,进程收;2. 进程发,(其他或自己)进程收
信号的本质是软件层次上对中断的一种模拟(软中断)。signal机制可以被理解成进程的软中断 它是一种异步通信的处理机制(进程不知道信号何时到来)
操作系统给进程发送信号,本质上是给进程的task_struct中写入数据,修改相应的task_struct字段(信号域的信号位图),然后进程在合适的时间去处理所接受的信号。
1.这里的合适的时间:可以理解成从内核态返回用户态时 2.进程控制块中设计了一个signal的位图信息。其中的每位与具体的signal相对应,这与中断机制是保持一致的。
1.假设用户启动一个交互式的前台进程,然后输入ctrl+c结束它,系统通过键盘产生一个硬件中断。 2.cpu暂停用户空间的代码,cpu从用户态切换至内核态处理中断 3.系统驱动程序将ctlr+c解释为一个SIGINT信号,并将其记在该进程的task_struct中的信号位上; 4.当某时刻进程从内核态返回用户态继续执行之前,检查task_struct中的信号域,SIGINT信号的默认处理动作为终止进程,所以直接终止进程而不再返回到它的用户空间代码。
进程间效果,可以携带少量int数据进行传递。
5.1.1 kill()函数
1.kill功能:进程可以通过kill函数向包括它本身在内的其他进程发送一个信号
函数原型:
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的值,不能是负数
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。