`
yangzhiyong77
  • 浏览: 963278 次
文章分类
社区版块
存档分类
最新评论

进程同步与通信

 
阅读更多

进程通信


信号通信


信号的本质:信号是在软件层次上对中断机制的一种模拟,信号是进程通信间唯一的异步通信机制。
信号的来源:

硬件来源,包括硬件异常,除零,越界访问,这些信号由内核产生,并发送到相关进程;
软件来源,某些软件事件如alarm()函数产生SIGALRM信号,管道通信产生SIGPIPE;进程使用kill() raise()等函数。

信号的相应方式:

忽略信号,但是有两个信号不能忽略,SIGKILL SIGSTOP

捕捉信号,定义信号处理函数

执行默认操作

信号发送的限制

核心和超级用户和可发信号给任何一个进程
普通用户只能向与自己具有相同uid和gid的进程,或者在同意进程组中的进程发送信号

可靠信号和不可靠信号

Linux继承UNIX系统中的信号机制,早期UNIX为了避免信号频繁到达而引起进程堆栈溢出,就将对信号的的相应在每次处理信号后设置为默认动作,因此在信号处理函数里需要每次安装信号处理函数,而由于信号的到来是随机的,如果一个信号到来后,系统调用我们注册的信号处理函数,而此时我们还没有来得及作“安装信号处理函数”(singal())的操作,这时再到达一个信号,系统就会采取默认操作,因此这种信号不可靠。Linux支持UNIX的不可靠信号,并做了修改,也就是在调用完信号处理函数后,系统不会把对该信号的处理恢复为默认动作,用户也不必在信号处理函数里安装信号处理函数。因此,Linux下的不可靠主要是指信号可能丢失。0-31是不可靠信号,32-63是可靠信号,可靠信号支持排队。
现在的Linux的signal函数通过sigaction() 函数实现,在信号处理函数里不必安装信号处理函数,而且由signal()函数安装的信号都支持排队。signal() sigaction()的区别是后者可以传递信息给信号处理函数。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics