[size=large]信号的产生:[/size]
1 按下按键
2 硬件异常信号:除数为0,无效的存储访问
3 用kill函数将信号发给另一个线程
4 用kill命令将信号发给另一个线程
[size=large]常见信号:[/size]
SIGUP 从终端发出的结束信号
SIGINT 来自键盘的中断信号( Ctrl-C)
SIGKILL 该信号结束接受信号的进程
SIGTERM kill命令发出的信号
SIGCHLD 标志子进程停止或结束的信号
SIGSTOP 来自键盘(Ctrl-Z)或者调试程序的停止执行信号
[size=large]信号处理[/size]
1 忽略此信号
但SIGKILL和SIGSTOP不能被忽略
2 执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数
3 执行系统默认动作
大多数默认动作时中止该进程
[size=large]信号发送[/size]
kill和raise函数
kill向自己和别的进程发信号
raise只能向自身发信号
[size=medium]alarm函数[/size]: 定时发送SIGALARM信号, 默认动作时中止该进程
每个进程只能有一个闹钟时间,新alarm会替换原alarm
seconds=0表示取消以前的闹钟
[size=medium]pause函数[/size]: 使调用进程挂起,知道捕捉到一个信号
[size=x-large]信号的处理[/size]
1 使用简单的signal函数
2 使用信号集函数组
指定某个信号的处理函数
Func可能的值是:
1 SIG_IGN 忽略此信号
2 SIG_DFL 按默认方式处理
3 信号处理函数名 使用该函数处理 该函数的参数必须是int, 无返回值
示例:
1 按下按键
2 硬件异常信号:除数为0,无效的存储访问
3 用kill函数将信号发给另一个线程
4 用kill命令将信号发给另一个线程
[size=large]常见信号:[/size]
SIGUP 从终端发出的结束信号
SIGINT 来自键盘的中断信号( Ctrl-C)
SIGKILL 该信号结束接受信号的进程
SIGTERM kill命令发出的信号
SIGCHLD 标志子进程停止或结束的信号
SIGSTOP 来自键盘(Ctrl-Z)或者调试程序的停止执行信号
[size=large]信号处理[/size]
1 忽略此信号
但SIGKILL和SIGSTOP不能被忽略
2 执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数
3 执行系统默认动作
大多数默认动作时中止该进程
[size=large]信号发送[/size]
kill和raise函数
kill向自己和别的进程发信号
raise只能向自身发信号
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)
[size=medium]alarm函数[/size]: 定时发送SIGALARM信号, 默认动作时中止该进程
#include <unistd.h>
usigned int alarm(usigned int secondes)
每个进程只能有一个闹钟时间,新alarm会替换原alarm
seconds=0表示取消以前的闹钟
[size=medium]pause函数[/size]: 使调用进程挂起,知道捕捉到一个信号
#include <unistd.h>
int pause(void)
[size=x-large]信号的处理[/size]
1 使用简单的signal函数
2 使用信号集函数组
指定某个信号的处理函数
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int)
//等价于
typedef void (*sighandler_t)(int)//返回值为函数指针
//参数和返回值均是函数指针
sighandler_t signal(int signum, sighandler_t handler))
Func可能的值是:
1 SIG_IGN 忽略此信号
2 SIG_DFL 按默认方式处理
3 信号处理函数名 使用该函数处理 该函数的参数必须是int, 无返回值
示例:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void my_func(int sign_no){
if(sign_no==SIGINT)
printf("I have get SIGINT\n");
else if(signo==SIGQUIT)
printf("I have get SIGQUIT\n");
}
int main(){
printf("waiting for signal SIGNT or SIGQUIT \n");
//注册信号处理函数
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();//等待处理信号
exit(0);
}