(二十九)信号——概念

什么是信号?


  在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。

简单来说,信号就是一种Linux环境下进程通讯的一种机制。

在linux中各种信号以及其编号和名称可以使用命令$ kill -l查看:

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

  常用的是前32个,即标准(Standard)信号,但是对于驱动开发的同学往往会使用后面32个,后32为实时(Real-time)信号。

  也可以使用$ man 7 signal查看详细的信号介绍:

man 7 signal

Term    Default action is to terminate the process.
Ign     Default action is to ignore the signal.
Core    Default action is to terminate the process and dump core (see core(5)).
Stop    Default action is to stop the process.
Cont    Default action is to continue the process if it is currently stopped.


Signal     Value      Action          Comment
SIGHUP       1      Term Hangup       detected on controlling terminalor death of controlling process
SIGINT       2         Term           Interrupt from keyboard
SIGQUIT      3         Core           Quit from keyboard
SIGILL       4         Core           Illegal Instruction
SIGABRT      6         Core           Abort signal from abort(3)
SIGFPE       8         Core           Floating point exception
SIGKILL      9         Term           Kill signal
SIGSEGV      11        Core           Invalid memory reference
SIGPIPE      13        Term           Broken pipe: write to pipe with noreaders
SIGALRM      14        Term           Timer signal from alarm(2)
SIGTERM      15        Term           Termination signal
SIGUSR1    30,10,16    Term           User-defined signal 1
SIGUSR2    31,12,17    Term           User-defined signal 2
SIGCHLD    20,17,18    Ign            Child stopped or terminated
SIGCONT    19,18,25    Cont           Continue if stopped
SIGSTOP    17,19,23    Stop           Stop process
SIGTSTP    18,20,24    Stop           Stop typed at tty
SIGTTIN    21,21,26    Stop           tty input for background process
SIGTTOU    22,22,27    Stop           tty output for background process

The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

  表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:

Term表示终止当前进程.
Core表示终止当前进程并且Core Dump(Core Dump 用于gdb调试).
Ign表示忽略该信号.
Stop表示停止当前进程.
Cont表示继续执行先前停止的进程.

表中最后一列是简要介绍,说明什么条件下产生该信号。


如何向进程发送信号?

常见的发送信号的方式有四种:

1) 终端特殊按键:
  ctl+c  SIGINT
  ctl+z  SIGTSTP
  ctl+\  SIGQUIT

2) kill命令

3) kill函数:
  int kill(pid_t pid, int sig)
    pid > 0
      sig发送给ID为pid的进程
    pid == 0
      sig发送给与发送进程同组的所有进程
     pid < 0
      sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限
    pid == -1
      sig发送给发送进程有权限向他们发送信号的系统上的所有进程

4)某种软件条件已发生,例如定时器alarm到时(注:每个进程只有一个定时器):
   unsigned int alarm(unsigned int seconds)

举例:

/* kill函数的使用 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>

int main(int argc, char *argv[])
{
    if(argc < 3)
    {
        printf("./app signal pid\n");
        exit(-1);
    }

    if(kill((pid_t)atoi(argv[2]),atoi(argv[1])) < 0)
    {
        perror("kill");
        exit(1);
    }

    return 0;
}



/* alarm的使用 */
#include <unistd.h>
#include <stdio.h>
int main(void)
{
    int counter;
    alarm(1);
    for(counter=0; 1; counter++)
        printf("counter=%d ", counter);
    return 0;
}
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值