信号通信
用户按某些键时,产生信号
硬件异常产生信号
进程用kill函数将信号发送给另一个进程
可以用kill函数将信号发送给其他进程
信号的类型
1 sighup 从终端上发出的结束信号
2 sigint 来自键盘的中断信号(ctrl-c)
3 sigquit
4 sigill
5 sigtrap
6 sigiot
7 sigbus
8 sigfpe
9 sigkill 结束接收信号的进程
10 sigusr1
11 sigsegv
12 sigusr2
13 sigpipe
14 sigalrm
15 sigterm kill命令发出的信号
17 sigchld 标识子进程停止或结束的信号
18 sigcont
19 sigstop 来自键盘(crtl-z)或调试程序的停止执行信号
20 sigtstp
21 sigttin
22 sigttou
23 sigurg
24 sigxcpu
25 sigxfsz
26 sigvtalrm
27 sigprof
28 sigwinch
29 sigio
30 sigpwr
信号处理
当信号出现时,将按照下列三种方式中的一种进行处理:
1 忽略此信号
sigkill和sigstop这两种信号除外
2 执行用户希望的动作
3 执行系统默认动作
信号的发送
发送信号的主要函数有:
kill: 可以向自身发送信号,也可以向其他进程发送信号
raise:向进程自身发送信号
函数原型:
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid,int signo)
int raise(int signo)
alarm
使用alarm函数可以设置一个时间值,当设置时间到时,会产生一个sigalrm信号
如果不捕捉此信号,默认动作是终止该进程
注:每个进程只能有一个闹钟时间,当seconds值是0,表示取消以前的闹钟
函数原型:
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
seconds:经过了指定的seconds秒后会产生信号sigalrm
pause
使调用进程挂起直至捕捉到一个信号
函数原型:
#include <unistd.h>
int pause(void)
信号的处理
1可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式
2 使用简单的signal函数,或是使用信号集函数组
signal
函数原型
#include <signal.h>
void (*signal(int signo,void(*func)(int)))(int)
func可能的值是:
sig_ing 忽略此信号
sig_dfl 按系统默认方式处理
信号处理函数名 使用该函数处理
示例代码如下:
#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(sign_no==SIGQUIT){
printf("i have get SIGQUIT\n");
}
}
int main(){
printf("waiting for signal SIGNINT or SIGQUIT \n");
/*注册信号处理函数*/
signal(SIGINT,my_func);
signal(SIGQUIT,my_func);
pause();
exit(0);
}
编译执行:
[root@localhost app]# gcc mysignal.c -o mysignal
[root@localhost app]# ./mysignal
waiting for signal SIGNINT or SIGQUIT
打开另一终端
查看进程id
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9837 0.0 0.0 1624 308 pts/1 S+ 02:38 0:00 ./mysignal
查看返回结果:
i have get SIGINT