signal信号通信

来源:互联网 发布:linux 进程日志 编辑:程序博客网 时间:2024/06/08 06:21
每个进程只属于一个进程组,进程组由一个正整数进程组ID来标识。
int kill(pid_t pid, int sig);
kill函数用于向进程发送信号,当pid>0,kill发送sig给进程pid;当pid<0kill发送sig给进程组abs(pid)中的每个进程。
unsigned int alarm(unsigned int secs);
alarm函数用于在secs妙内发送一个SIGALRM信号给调用进程。对alarm的调用将取消待处理闹钟,并发挥待处理闹钟发送前剩余妙数。
SIGSTOP、SIGKILL的默认行为不能被修改。
signal函数用于接收信号:
当其第二个形参为SIG_IGN时,忽略类型为第一形参的信号
当其第二个形参为SIG_DFL时,类型为第一形参的信号恢复默认行为。
否则第二形参为信号处理程序的地址。
例子:
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<signal.h>

void handler( int sig )
{
    printf("catch signal\n" );
    exit( 0);
}
int main( int argc, char **argv )
{
    if(signal(SIGINT, handler) == SIG_ERR )
       perror( "signal error!" );
   pause();

    exit( 0);
}
当在键盘上输入ctrl-c时发送SIGINT信号,调用handler函数


当处理多个信号时产生的问题(深入理解计算机系统二511):
1,待处理信号被阻塞
2,待处理信号不会排队等待
任意类型至多只有一个待处理信号。如果两个信号类型一致,并且进程正在执行其中一个信号的信号处理函数,那么第二个传送的信号会被丢弃。
3,系统调用可以被中断
处理程序捕获到一个信号时,被中断的慢速系统调用(read\write\accept等)在信号处理程序返回时不再继续,而是返回一个错误条件,设置errno为EINTR。
0 0
原创粉丝点击