Linux进程间通信程序设计3----信号通信
信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件下可以产生一个信号:
1、用户按某些按键时,产生信号。
2、硬件异常信号:除数为0,无效的存储访问等。
3、进程利用kill函数,将信号发送给另一个进程。
4、用户利用kill命令将信号发送给其他进程。
信号类型:
常用类型:
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl-C:结束进程)
SIGKILL:该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGSTOP:来自键盘或调试程序的停止执行信号。
信号处理
1、忽略此信号:但SIGKILL和SIGSTOP不能忽略。
2、执行用户希望的动作:通知内核在某种信号产生时,调用一个用户函数,在用户函数中,执行用户希望的处理。
3、执行系统默认动作:对大多数信号的系统默认动作是终止该进程。
信号发送
发送信号的主要函数有kill和raise
区别:kill可以给自己发,也可以给别的进程发。raise函数是向进程自身发送信号。
#include<sys/types.h>
#include<signal.h>
int kill(pid_t pid,int signo)
pid有四种不同情况:
pid>0 将信号发送给进程ID为pid的进程。
pid==0将信号发送给同组的进程。
pid<0将信号发送给其进程组ID等于pid绝对值的进程。
pid==-1将信号发送给所有进程。
int raise(int signo)
Alarm
使用该函数,可以设置一个时间值(闹钟时间),当所设置时间到了时,产生SIGALRM信号。如果不捕捉此信号,则默认动作是终止该进程。
#include<unistd.h>
unsigned int alarm(unsigned int seconds):经过SECOND秒后,产生信号SIGALRM
Pause
使调用进程挂起,直至捕捉到一个信号。
#include <uintstd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。
信号处理:
1、使用简单signal函数。
2、使用信号集函数组。
例如:
int main()
{
printf("Waiting for signal SIGINT or SIGQUIT \n");
signal(SIGINT,myfunc);
signal(SIGQUIT,my_func);
pause();
exit(0);
}