博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unix进程间通讯之信号
阅读量:5060 次
发布时间:2019-06-12

本文共 989 字,大约阅读时间需要 3 分钟。

产生信号的条件:

  按某些终端键时,如Delete,Ctrl+C等。

  硬件产生异常信号,除数为0,无效的内存引用等。

  Kill函数可以将任意信号发送给另一个进程或进程组。

  再控制台界面使用kill命令终止一个失控的后台进程。

  当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号,如管道的都进程已终止后,一个进程写进此管道

相应的,再接收到信号时,可以采取以下三种措施:

  忽略信号,但是有些信号不能被忽略

  捕捉信号,通过使用signal为当前进程的某信号注册一个函数,在接收到信号时,执行对应函数

  执行默认动作,没有为信号指定应该如何处理时,使用该系统默认的方法处理信号。

 

信号处理方面,待处理信号不会排队等待。即针对同一类型的信号,只能有一个待处理信号。例如,一个进程接受了一个SIGCHLD的信号,在执行SIGCHLD的信号处理程序的时候,来了两个SIGCHLD信号,那么只有一个SIGCHLD会成为待处理信号。

SIGCHLD信号是在子进程状态改变后产生此信号, 父进程需要调用一个wait函数以检测发生了什么。

 

函数kill和raise:

  kill有两个参数,第一个参数为pid_t,第二个参数为信号,其实kill的这个函数的名字并不准确,kill函数的功能和他的名字“杀死”并不符合,它的作用是向某一指定进程发送指定信号。

  假如pid_t为大于零,则发送给该进程,假如==0,发送给同进程组的所有进程。

  pid小于零,发送给进程组ID等于绝对值的所有进程。

  pid==-1,发送给全部进程。

  注意,kill只会向那些有kill有权限向他们发送信号的进程   发送信号。

  raise函数其实封装了一层kill 调用raise(signo)== kill(getpid(),signo);

Alarm和Pause:

  alarm函数可以设置一个定时器,在某个时刻定时器会超时,当定时器超时,产生SIGALAR信号,如果忽略或不捕捉信号,默认动作是终止调用该alarm函数的进程。

  pause函数是进程鼓起直至捕捉到一个信号。

  使用alarm和pause可以实现sleep函数。这一部分后续添加。

 

转载于:https://www.cnblogs.com/derek-dhw/p/11106861.html

你可能感兴趣的文章
Qt中QTableView中加入Check列实现
查看>>
“富豪相亲大会”究竟迷失了什么?
查看>>
控制文件的备份与恢复
查看>>
返回代码hdu 2054 A==B?
查看>>
Flink独立集群1
查看>>
iOS 8 地图
查看>>
20165235 第八周课下补做
查看>>
[leetcode] 1. Two Sum
查看>>
iOS 日常工作之常用宏定义大全
查看>>
PHP的SQL注入技术实现以及预防措施
查看>>
MVC Razor
查看>>
软件目录结构规范
查看>>
Windbg调试Sql Server 进程
查看>>
linux调度器系列
查看>>
mysqladmin
查看>>
解决 No Entity Framework provider found for the ADO.NET provider
查看>>
SVN服务器搭建和使用(三)(转载)
查看>>
Android 自定义View (三) 圆环交替 等待效果
查看>>
设置虚拟机虚拟机中fedora上网配置-bridge连接方式(图解)
查看>>
HEVC播放器出炉,迅雷看看支持H.265
查看>>