zoukankan      html  css  js  c++  java
  • signal函数

    处理信号

           #include <signal.h>
    
           typedef void (*sighandler_t)(int);
    
           sighandler_t signal(int signum, sighandler_t handler);

    第一个参数是信号码

    第二个参数是指向执行函数的指针。或者这两个常量:SIG_DFL(默认处理程序) SIG_IGN(忽略信号)

    返回值:

    该函数返回信号处理程序之前的值,当发生错误时返回 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) 发送给本程序的终止请求信号。

    常用signal,可以通过 kill -l 查看

    Signal  Description
    SIGABRT 由调用abort函数产生,进程非正常退出
    SIGALRM 用alarm函数设置的timer超时或setitimer函数设置的interval timer超时
    SIGBUS 某种特定的硬件异常,通常由内存访问引起
    SIGCANCEL 由Solaris Thread Library内部使用,通常不会使用
    SIGCHLD  进程Terminate或Stop的时候,SIGCHLD会发送给它的父进程。缺省情况下该Signal会被忽略
    SIGCONT 当被stop的进程恢复运行的时候,自动发送
    SIGEMT  和实现相关的硬件异常
    SIGFPE 数学相关的异常,如被0除,浮点溢出,等等
    SIGFREEZE Solaris专用,Hiberate或者Suspended时候发送
    SIGHUP 发送给具有Terminal的Controlling Process,当terminal 被disconnect时候发送
    SIGILL 非法指令异常
    SIGINFO  BSD signal。由Status Key产生,通常是CTRL+T。发送给所有Foreground Group的进程
    SIGINT 由Interrupt Key产生,通常是CTRL+C或者DELETE。发送给所有ForeGround Group的进程
    SIGIO 异步IO事件
    SIGIOT 实现相关的硬件异常,一般对应SIGABRT
    SIGKILL 无法处理和忽略。中止某个进程
    SIGLWP 由Solaris Thread Libray内部使用
    SIGPIPE 在reader中止之后写Pipe的时候发送
    SIGPOLL  当某个事件发送给Pollable Device的时候发送
    SIGPROF Setitimer指定的Profiling Interval Timer所产生
    SIGPWR 和系统相关。和UPS相关。
    SIGQUIT 输入Quit Key的时候(CTRL+)发送给所有Foreground Group的进程
    SIGSEGV 非法内存访问
    SIGSTKFLT Linux专用,数学协处理器的栈异常
    SIGSTOP 中止进程。无法处理和忽略。
    SIGSYS 非法系统调用
    SIGTERM 请求中止进程,kill命令缺省发送
    SIGTHAW Solaris专用,从Suspend恢复时候发送
    SIGTRAP 实现相关的硬件异常。一般是调试异常
    SIGTSTP Suspend Key,一般是Ctrl+Z。发送给所有Foreground Group的进程
    SIGTTIN 当Background Group的进程尝试读取Terminal的时候发送
    SIGTTOU 当Background Group的进程尝试写Terminal的时候发送
    SIGURG 当out-of-band data接收的时候可能发送
    SIGUSR1  用户自定义signal 1
    SIGUSR2 用户自定义signal 2
    SIGVTALRM setitimer函数设置的Virtual Interval Timer超时的时候
    SIGWAITING Solaris Thread Library内部实现专用
    SIGWINCH 当Terminal的窗口大小改变的时候,发送给Foreground Group的所有进程
    SIGXCPU 当CPU时间限制超时的时候
    SIGXFSZ 进程超过文件大小限制
    SIGXRES Solaris专用,进程超过资源限制的时候发
    #include <stdio.h>
    #include <signal.h>
     
    int main()
    {
        signal(SIGINT, SIG_IGN);
        while(1)
        {
            printf("hello
    ");
            sleep(1);
        }
        return 0;
    }

    忽略信号,执行后 按 ctrl+c 无法终止程序运行,此时按 ctrl+  

    #include <stdio.h>
    #include <signal.h>
     
    int main()
    {
        signal(SIGINT, SIG_DFL);
        while(1)
        {
            printf("hello
    ");
            sleep(1);
        }
        return 0;
    }

    按默认方式执行,所以按 ctrl+c 有效果

  • 相关阅读:
    问题记录_Idea2021.2.3版本,Windows11版本,注册无法跳转Google浏览器
    问题记录_在IDEA中使用Git操作缓慢
    百页 PPT BPF 技术全览 深入浅出 BPF 技术
    揭秘 BPF map 前生今世
    一道双哈希题,但是为什么TLE??2021山东icpc省赛 F题 Birthday Cake
    oracle游标使用的几个场景
    MySQL 锁问题(脏读、锁阻塞、死锁)
    oracle存储过程中的变量
    tableau学习
    Power BI学习
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/13710244.html
Copyright © 2011-2022 走看看