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函数。这一部分后续添加。