1.信号是unix系统中最基础的进程间通信机制,有以下情况可以产生信号:
1.1.当用户按某些按键时产生信号;
1.2.硬件异常产生信号(除数为零,无效的存储访问等等);
1.3.进程用kill函数将信号发送给另一个进程
1.4.用户用kill命令将信号发送给其他进程
2.常见信号类型:
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl-C)
SIGKILL:结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGSTOP:来自键盘或调试程序的停止信号(Ctrl-Z)
3.信号发送
3.1kill函数:
#include<sys/types.h>#include<signal.h>int kill(pid_t pid,int signum)
可以向进程自身发送信号,也可以向其他进程发送信号。
pid>0,将信号发送给进程ID为pid的进程;pid==0,将信号发送给同组进程;pid<0,将信号发送给进程组id等于pid绝对值的进程;pid==-1,将信号发送给所有进程。
3.2raise函数
#include<sys/types.h>#include<signal.h>int raise(int signum)
只能向进程自身发送信号
3.3alarm函数
#include<unistd.h>unsigned int alarm(unsigned int seconds)
设置一个时间值seconds,当经过seconds秒后,产生SIGALARM信号,如果不捕捉此信号,系统默认结束该进程。每个进程只能有一个alarm时间,新的alarm时间将更新旧的alarm时间;当seconds被设置为0,表示关闭alarm操作。
3.4pause函数
#include<unistd.h>int pause(void)
使调用的进程挂起直至捕捉到一个信号。
4.信号处理
4.1忽略信号:大多数信号都按这种方式进行处理,但SIGKILL和SIGSTOP不能被忽略。
4.2执行用户希望的动作:通知内核在某种信号发生时调用一个用户函数。
4.3执行系统默认的操作:对大多数信号的系统默认操作时终止该进程。
信号处理的主要方法有两种,一种使用signal函数,一种使用信号集函数组。
4.4signal函数
#include<signal.h>void (*signal(int signum,void(*func)(int)))(int)
==>>
typedef void (*sighandler_t)(int) //函数指针sighandler_t signal(int signum,sighandler_t handler)
func可以是:
SIG_IGN:忽略此信号
SIG_DFL:使用系统默认方式
信号处理函数名:使用该函数(handler)处理,如下:
#include <signal.h>#include <stdio.h>#include <stdlib.h>/*自定义信号处理函数*/void my_func(int sign_no){if(sign_no==SIGBUS)printf("I have get SIGBUS\n");}int main(){printf("Waiting for signal SIGBUS \n ");/*注册信号处理函数*/signal(SIGBUS,my_func);pause();//将进程挂起直到捕捉到信号为止exit(0);}
学习会使你永远立于不败之地。