信号通信
产生情况:
1、当用户按某些按键时,产生信号
2、硬件异常产生信号,无效存储。
3、进程用kill函数将进程杀掉
4、用户可以使用kill命令将信号发给其他进程
第一、信号类型
SIGHUP SIGTRAP SIGIOT SIGBUS SIGFPT
SIGINT SIGKILL SIGUSER1 SIGSEGV SIGUSER2
SIGQUIT SIGPIPE SIGALRM SIGTERM
SIGILL SIGCHLD SIGCONT SIGSTOP SIGIO SIGPWR
SIGTSTP SIGTTIN SIGTTOU SIGURG SIGPROF SIGXFSZ
SIGHUP :从终端发出结束信号
SIGINT: 来自键盘的中断信号
SIGKILL: 该信号结束接收信号进程
SIGTERM: kill 命令发出的信号
SIGCHLD: 表示子进程结束,或停止
SIGSTOP:来自键盘ctrl-z,停止信号
第二、信号处理机制
1、忽略此信号
2、执行用户希望的动作 信号来了,按照用户设置处理
3、执行系统磨人的动作 一般默认都是终止该进程
信号的发送
Kill既可以向自身发送信号,也可以向其他进程发送;
raise只能向自己发送
int kill(pid_t,int signo)
int raise (int signo)
kill的pid参数四种情况
1、pid>0 将信号发送给进程ID的pid进程
2、pid==0 将信号发送给同组的进程
3、pid<0 将信号发送给其它进程id等于pid绝对的进程
4、pid==-1 坚信好发送给所有进程
第三、alarm函数的使用
alarm函数也可以发送信号,有定时作用,发送给自己!
#include<unistd.h>
unsigned int alarm (unsigned int seconds) //在未来的时间给自己发信号
int pause(void) 函数使用调用进程挂起,直到捕捉到一个信号
int pause(void) //只有等待信号处理函数后,挂起才结束
第四、signal()函数的使用
void(*signal(int signo,void(*func)(int)))(int) 返回是一个int 型的指
typedef void (*sighandler_t)(int) // 定义一个sighander函数指针
sighander_t signal(int signum,sighand_t handr)
Func可能的值是:
1、SIG_IGN 忽略此信号
2、SIG_DEF 系统默认
3、信号处理函数名 signal(int signo,void (*func)(int))可以自己
指定当信号来临时执行的函数;
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void my_func(int sign_no) 此函数必须只有一个参数int型
{
if(sign_no==SIGINT)
printf("I have get SIGINT\n");
else if(sign_no==SIGQUIT)
printf("I have get SIGQUIT\n");
}
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT \n ");
/*注册信号处理函数*/
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();
exit(0);
}
发送信号:kill -s SIGQUIT 2324