信号:是UNIX和LINUX系统响应某些条件而产生的一个事件。是由于某些错误条件而产生的,如内存冲突、浮点处理器错误或非法指令等。它们由shell和终端处理器引起的中断,他们还可以作为在进程中传递消息或修改行为的一种方式,明确的由一个进程发送给另外一个进程。无论何种情况,他们的编程接口都是相同的。信号可以被捕获,响应或者忽略。
术语捕获(catch):表示接受到一个信号。
信号可以被生成,捕获,响应或忽略。
定义在头文件signal.h中。
如果进程中收到其中的一个信号,而没有捕获它,那么进程会立即终止。
SIGHLD 子进程已经停止或者退出。在默认情况下是被忽略的。
SIGCONT的作用是让进程恢复并继续执行。
Ctrl+C组合键会向正在运行的程序发送SIGINT信号,终止该程序。除非它事先捕获了这个程序。
程序可以用signal库函数来处理信号,它的定义如下:
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int , sighandler_t handler);
int signum,:指定的信号
sighandler_t handler:信号处理函数,以下可以代替信号处理函数
SIG_ING 忽略信号
SIG_DFL 恢复默认行为
信号处理:捕获到Ctrl+C后,调用信号处理函数,然后将信号SIGINT设置为默认行为。
#include<signal.h>
#include<stdio.h>
#include<unistd.h>
void func(int sig)
{
printf("sig = %d\n",sig);
signal(SIGINT,SIG_DFL);
}
int main()
{
signal(SIGINT,func);
while(1)
{
printf("HI\n");
sleep(1);
}
exit(0);
}
返回值返回先前对指定信号的处理函数的函数指针,如果没有信号处理函数,则返回SIG_ERR并设errno为一个
正数。如果给出的是一个无效的信号,或者不可捕获或者不可忽略的信号(SIGKILL),error将会设为EINVAL
2.发送信号
#include<sys/type.s>
#include<signal.h>
int kill(pid_t pid,int sig);
成功返回0
失败返回 -1。失败的原因:给定的信号无效(errno:EINVAL);发送得权限不够(errno:EPERM);目标进程并不存在(errno:ESRCK)
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
在seconds后发送一个SIGALRM(超时警告)信号。
一个健壮的信号接口
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
信号集
#include <signal.h>
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);