进程间的信号通信

1.信号通信:
信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
(1)当用户按某些按键时,产生信号。    
(2)硬件异常产生信号:除数为0,无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产
生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。     
(3)进程用kill函数将信号发送给另一个进程。
(4)用户可用kill命令将信号发送给其他进程。
2.信号类型:
下面是几种常见的信号:
(1)SIGHUP: 从终端上发出的结束信号。
(2)SIGINT: 来自键盘的中断信号(Ctrl-C)。
(3)SIGKILL:该信号结束接收信号的进程,杀死进程。
(4)SIGTERM:kill 命令发出的信号。
(5)SIGCHLD:子进程停止或结束时通知父进程。
(6)SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号,暂停进程。
3.信号处理:
当某信号出现时,将按照下列三种方式中的一种进行处理:
(1)忽略此信号:大多数信号都按照这种方式进行处理,但有两种信号决不能被忽略,它们是:SIGKILL\SIGSTOP。
这两种信号不能被忽略的原因是:
它们向超级用户提供了一种终止或停止进程的方法。
(2)执行用户希望的动作:
通知内核在某种信号发生时,调用一个用户函数。在用户函数中,执行用户希望的处理。
(3)执行系统默认动作:
对大多数信号的系统默认动作是终止该进程。
4.几个有关信号处理的函数:
 (1)kill
 函数功能:发送信号给指定的进程
 函数的原型: int kill(pid_t pid, int sig);
 函数的参数:传送指给定的sig信号给参数pid;
                       pid > 0: 进程号为pid的进程;
                       pid = 0; 把信号传给和目前进程同进程组的所有进程;
                       pid = -1,  把信号给系统内所有的进程;
                       pid  <0 ;  传给进程组号为pid绝对值的所有进程;
  返回值:   成功为0,出错-1;
  头文件:  #include
            #include  
    
(2) raise
函数的作用:向进程自身发送一个信号;
函数的原型: int  raise(int sig);
返回值:成功是0,出错-1;
头文件:#include
(3)alarm
函数的作用:设置闹钟信号,scod时间后SOGALRM信号传送给目前的进程;
函数的原型: unsigned int alarm(unsigned int sceconds);
返回值: 返回之前闹钟的剩余秒数, 未设闹钟返回0;
(4) pause
函数的作用:  市当前进程挂起,直至捕获到一个信号;
函数的原型:int  pause(void)
头文件: #include
(5)signal
函数的作用:  设置信号处理方式
函数的原型:void ( * signal (int signum, void  ( *handler ) (int) ) )(int)
这样看函数很难理解,我们可以对其进行下面的操作,就容易理解
typedef   void (*handler) (int) ) sighandler_t
signal (int signum, sighandler_t handler);
函数说明:signal()会依参数signum指定的信号编号来设置该信号的处理函数,当指定信号到达时就会跳转到参数
handler指定的函数执行。如果参数handler不是函数指针,则必须是下列两个常量之一:
SIG_IGN:忽略参数signum指定的信号。
SIG_DFL:将参数signum指定的信号重设为核心预设的信号处理方式。
返回值:返回先前的信号处理函数,如果出错则返回-1。

你可能感兴趣的:(进程间的信号通信)