Unix进程间通讯之信号

产生信号的条件:

  按某些终端键时,如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