信号

概念:

​ 信号是软件中断。信号提供了一种处理异步事件的方法。例如,终端用户键入中断键,会通过信号机制停止一个程序,或及早终止管道中的下一个程序。

​ 每个信号都有一个名字,以 ’ SIG ‘ 开头。在头文件<signal.h>中,信号名都被定义为正整数常量。不存在编号为0的信号。因为kill函数对信号编号0有特殊的应用。

产生信号的条件:
  • 当用户按某些终端键,引发终端产生的信号。
  • 硬件异常产生信号。
  • 进程调用kill函数可将任意信号发送给另一个进程或进程组。
  • 用户可以用kill命令将信号发送给其他进程。
  • 当检测到某种软件条件已经发生,并将其通知有关进程时也产生信号。
信号处理三动作:
  1. 忽略此信号
  2. 捕捉信号
  3. 执行系统默认动作
常用的信号:
信号描述编号
SIGHUP挂起1
SIGINT中断2
SIGQUIT退出并转储核心3
SIGILL非法指令4
SIGTRAP跟踪/断点 陷阱5
SIGABRT进程退出6
SIGBUS总线错误,进入内存对象未定义部分7
SIGFPE浮点指针异常,错误的算数8
SIGKILL杀死(尽快终止)9
SIGUSR1用户定义110
SIGSEGV段非法11
SIGUSR2用户定义212
SIGPIPE无读操作时写入管道13
SIGALRM计时器到时14
SIGTERM终止(要求终止)15
SIGSTKFLT协处理器堆栈错误16
SIGCHLD子进程终止,停止或继续17
SIGCONT继续,如果停止18
SIGSTOP临时停止执行19
SIGTSTP由信号终止20
SIGTTIN后台进程试图从TTY 读入 (“in”)21
SIGTTOU后台进程试图写入TTY (“out”)22
SIGURGI/O紧急信号23
SIGXCPU超出CPU时间限制24
SIGXFSZ超出文件大小限制25
SIGVTALRM虚拟定时器超时26
SIGPROF统计分布图用计时器到时27
SIGWINCH窗口大小改变28
SIGPOLLPollable event29
SIGPWR电力故障(System V)30
SIGSYS不良的系统调用31
键盘快捷键主要有 3 种:
  • Ctrl + C (相当于发送信号 2, SIGINT)
  • Ctrl + Z (相当于发送信号 20, SIGTSTP)
  • Ctrl + \ (相当于发送信号 3,SIGQUIT)
函数原型:

程序可用使用signal函数来处理指定的信号,主要通过忽略和恢复其默认行为来工作。signal函数的原型如下:

#include <signal.h>
void (*signal(int sig, void (*func)(int)))(int);

​ 这是一个相当复杂的声明,可以看出signal是一个带有sig和func两个参数的函数,func是一个类型为void (*)(int)的函数指针。该函数返回一个与func相同类型的指针,指向先前指定信号处理函数的函数指针。准备捕获的信号的参数由sig给出,接收到的指定信号后要调用的函数由参数func给出。

给出一个例子来说明一下吧,源文件名为signal.c,代码如下:

#include<stdio.h>
#include <signal.h>
#include <unistd.h>
 
void sig_usr(int sig) {
    printf("\nI got signal-%d\n", sig);
    //恢复终端中断信号SIGINT的默认行为
    signal(SIGINT, SIG_DFL);
}
  
int main() {
    //改变终端中断信号SIGINT的默认行为
    signal(SIGINT, sig_usr);
    while(1) {
        printf("Hello World!\n");
        sleep(1);
    }
    return 0;
}

第一次按下终止命令(ctrl+c)时,进程并没有被终止,面是输出:I got signal-2,因为SIGINT的默认行为被signal函数改变了,当进程接受到信号SIGINT时,它就去调用函数sig_usr去处理,注意sig_usr函数把信号SIGINT的处理方式改变成默认的方式,所以当你再按一次ctrl+c时,进程就像之前那样被终止了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值