C语言库signal.h操作

signal.h
signal.h 头文件定义了一个变量类型 sig_atomic_t两个函数调用一些宏来处理程序执行期间报告的不同信号


signal.h 中定义的【变量类型】
sig_atomic_t  这是 int 类型,在信号处理程序中作为变量使用。
它是一个对象的整数类型,该对象可以作为一个原子实体访问,即使存在异步信号时,该对象可以作为一个原子实体访问。



下面是头文件 signal.h 中定义的【宏】,这些宏将在下列两个函数中使用。
SIG_ 宏与 signal 函数一起使用来定义信号的功能
1	SIG_DFL   默认的信号处理程序。
2	SIG_ERR   表示一个信号错误。
3	SIG_IGN   忽视信号。

SIG 宏用于表示以下各种条件的信号码:
1	SIGABRT   程序异常终止。
2	SIGFPE    算术运算出错,如除数为 0 或溢出。
3	SIGILL    非法函数映象,如非法指令。
4	SIGINT    中断信号,如 ctrl-C。
5	SIGSEGV   非法访问存储器,如访问不存在的内存单元。
6	SIGTERM   发送给本程序的终止请求信号。


信号量与对应值
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX	

库函数
下面是头文件 signal.h 中定义的【函数】
1	void (*signal(int sig, void (*func)(int)))(int)    该函数设置一个函数来处理信号,即信号处理程序。
2	int raise(int sig)   该函数会促使生成信号 sig。sig 参数与 SIG 宏兼容。



1.void (*signal(int sig, void (*func)(int)))(int【捕获到的信号值】) 
void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序
sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一
该函数返回信号处理程序之前的值,当发生错误时返回 SIG_ERR

SIGABRT	(Signal Abort) 程序异常终止。
SIGFPE	(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。
SIGILL	(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT	(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。
SIGSEGV	(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。
SIGTERM	(Signal Terminate) 发送给本程序的终止请

SIG_DFL	默认的信号处理程序。
SIG_IGN	忽视信号。


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void sighandler(int);

int main()
{
   signal(SIGINT, sighandler);

   while(1) 
   {
      printf("开始休眠一秒钟...\n");
      sleep(1);
   }

   return(0);
}

void sighandler(int signum)
{
   printf("捕获信号 %d,跳出...\n", signum);
   exit(1);
}

打印结果:【程序会进入无限循环,需使用 CTRL + C 键跳出程序】
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
开始休眠一秒钟...
捕获信号 2,跳出...




2.int raise(int sig) 
int raise(int sig) 会促使生成信号 sig。sig 参数与 SIG 宏兼容。
sig -- 要发送的信号码。下面是一些重要的标准信号常量:
如果成功该函数返回零,否则返回非零。

SIGABRT	(Signal Abort) 程序异常终止。
SIGFPE	(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。
SIGILL	(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT	(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。
SIGSEGV	(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。
SIGTERM	(Signal Terminate) 发送给本程序的终止请


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>

void signal_catchfunc(int);

int main()
{
    int ret;

   ret = signal(SIGINT, signal_catchfunc);

   if( ret == SIG_ERR) 
   {
      printf("错误:不能设置信号处理程序。\n");
      exit(0);
   }
   printf("开始生成一个信号\n");
   ret = raise(SIGINT); // 产生信号量
   if( ret !=0 ) 
   {
      printf("错误:不能生成 SIGINT 信号。\n");
      exit(0);
   }

   printf("退出...\n");
   return(0);
}

void signal_catchfunc(int signal)
{
   printf("!! 信号捕获 !!\n");
}

打印结果:
开始生成一个信号
!! 信号捕获 !!
退出...

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值