zoukankan      html  css  js  c++  java
  • [linux]信号的捕获和处理

    信号是一种软件中断,也是进程间唯一的异步通信方式。信号可通过硬件发送,如键入CTRL+C,或者程序发送。软件可通过signal函数捕捉信号,针对信号编写信号处理函数,进行异步操作。

    在终端可用kill命令发送信号。信号有优先级,高优先级的首先处理。

    1、signal(int signum,void (*f)(int))

    第一个参数为需要处理的信号,第二个参数为信号处理函数的指针。函数要求必须含一个int参数和返回void。

    #include "signal.h"
    void sig_process(int sig_no){
        printf("signal has been received
    ");
    }
    
    int main(int argc,char* argv[])
    {
        signal(SIGINT,sig_process);
        while(1);
        return 0;
    }

    2、int sigaction(int signum,const struct sigaction *act ,struct sigaction *oldact);

    sigaction用来设置信号处理方式。第一参数为处理信号,act是一个记录行为的结构体。主要设置响应函数和是否嵌套响应等信息。

    int main(int argc,char* argv[])
    {
        //signal(SIGINT,sig_process);
        struct sigaction act;
        act.sa_handler=sig_process;
        act.sa_flags=SA_NOMASK;//if set this,nesting(嵌套) is allowed.
        sigaction(SIGINT,&act,NULL);
        while(1);
        return 0;
    }

    3、int kill(pid_t pid,int sig);

    参数分别是目标进程的pid和信号,成功返回0,失败返回-1.

    使用sigqueue()也可以对目标进程发送信号,并发送数据

    4、int alarm(int seconds);

    调用函数seconds秒后,系统会向调用alarm函数的进程发送一个SIGALRMd的信号。函数settimer()也具有定时功能,其选项比alarm丰富。

    5、setprocmask()用来设置进程的屏蔽信号集;sigpending()用来查看被阻塞和未决的信号集。

    6、pause();

    调用后进程处于挂起状态,直到进程接收到任意信号才继续运行。可用于同步进程:先设置信号的处理函数,再挂起进程。其他进程的工作完成后向挂起的进程发送特定信号,挂起进程继续工作。

  • 相关阅读:
    mysql创建用户,并赋予权限:只能查某个数据库中的某张表(只读)
    Fastjson toJSONString用单引号进行转换
    MyBatis传入参数为list、数组、map写法
    进制GB和GiB的区别
    leaflet 根据一个经纬度及距离角度,算出另外一个经纬度
    ubuntu下安装YApi
    Oracle 存储过程测试
    Oracle两种临时表的创建与使用详解
    一月到十二月的英文
    spring framework各个版本下载网址
  • 原文地址:https://www.cnblogs.com/iyjhabc/p/3166590.html
Copyright © 2011-2022 走看看