信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:
一.当用户按某些键时,产生信号。
二.硬件异常产生信号:除数为零,非法的存储访问等等。这些情况通常是由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正在访问一个无效存储区的进程产生一个
SIGSEGV(SIG is a common prefix for signal names; SEGV is an abbreviation of segmentation violation)。
三.进程用kill函数将信号发送给另一个进程
四.用户可用kill命令将信号发送给其它进程
几种常见信号:
SIGHUP:从终端上发出的结束信号
SIGINT:来自键盘的中断信号(Ctrl-C)
SIGKILL :该信号结束接收信号的进程
SIGTERM:kill命令发出的信号
SIGCHLD:标识子进程停止或结束的信号
SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号
当某信号出现时,将按照下列三种方式中的一种进行处理:
一.忽略次信号
大多数信号都按照这种方式进行处理,但是有两种信号却不能被忽略。它们是:
SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供了一种终止或者停止进程的方法。
二.执行用户希望的动作
通知内核在某种信号发生时,调用一个用户函数。在这个用户函数中执行用户希望的处理。
三.执行系统默认的动作
对大多数信号的系统默认动作时终止该进程
信号发送
发送信号的主要函数有kill和raise。
区别:
Kill既可以向自身发送信号,也可以向其它进程发送信号。
raise函数是向进程自身发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int signo)
int raise(int signo)
alarm函数可以设置一个时间值(闹钟时间),当所设置的时间到了时,产生SIGALRM信号。如果捕捉不到次信号,择默认动作时终止该进程。
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
Seconds:指的是经过了指定的seconds秒后会产生信号SIGALRM。
pause函数使得调用进程挂起直至捕捉到一个信号。
#include <unistd.h>
int pause(void)
只有执行了一个信号处理函数后,挂起才结束。
信号的处理:当系统捕捉到某个信号时,可以忽略该信号或是使用指定的处理函数来处理该信号,或者使用系统默认的方式。
信号的处理的主要方法有两种:一是使用简单的signal函数,另一个是使用信号集函数族。
#include <signal.h>
void (*signal(int signo, void (*func)(int)))(int)
相当与下面两步操作:
typedef void (*sighander_t)(int) //定义一个函数类型为sighander_t
sighander_t signal(int signum, sighandler_t hander))
//signal 函数的返回值类型为sighander_t,参数为int型和sighander_t型
func可能的值为:
一.SIG_IGN:忽略此信号
二.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 SIGINT or SIGQUIT \n ");
signal(SIGINT, my_func);
signal(SIGQUIT, my_func);
pause();//调用进程挂起直至捕捉到一个信号,挂起才结束
exit(0);
}
注意:
首先在一个命令中端中执行该程序 ./mysignal
开启另一新的终端:用ps –aux 查看运行该程序的进程PID ps -aux
可以找到:
root 3891 0.0 0.0 1500 308 pts/1 S+ 12:54 0:00 ./mysignal
用kill命令向查看得到的进程号为PID的进程发送SIGINT or SIGQUIT kill -s SIGINT 3891
763

被折叠的 条评论
为什么被折叠?



