首页 > 系统相关 >Linux多进程18-sigaction 信号捕捉函数

Linux多进程18-sigaction 信号捕捉函数

时间:2023-05-17 18:59:31浏览次数:48  
标签:int 18 act value 信号 Linux sa sigaction

#include <signal.h>

int sigaction(int signum, const struct sigaction *act,
                struct sigaction *oldact);
    - 功能: 检查或者改变信号的处理, 信号捕捉
    - 参数:
        - signum: 需要捕捉的信号的编号或者宏值(信号的名称)
        - act: 捕捉到信号之后的处理动作
        - oldact: 上一次对信号捕捉相关的设置, 一般不使用, 传递NULL
    - 返回值:
        成功0, 失败-1

struct sigaction {
        void     (*sa_handler)(int); //函数指针, 指向的函数就是信号捕捉到之后的处理函数
        void     (*sa_sigaction)(int, siginfo_t *, void *); //不常用
        sigset_t   sa_mask; //临时阻塞信号集, 在信号捕捉函数执行过程中, 临时阻塞某些信号
        int        sa_flags;    //使用哪一个信号对捕捉到的信号进行处理
                                     这个值可以是0, 表示使用sa_handler, 也可以是SA_SIGINFO表示使用sa_sigaction
        void     (*sa_restorer)(void);  //已废弃, NULL
    };
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <sys/signal.h>
//过3S后, 每隔2S定时一次

void myalarm(int num)
{
    printf("捕捉到了信号的编号是: %d\n", num);
    printf("xxxxxxx\n");
}

int main(int argc, char const *argv[])
{

    struct sigaction act;
    act.sa_flags = 0;
    act.sa_handler = myalarm;
    sigemptyset(&act.sa_mask); //清空临时阻塞信号集
    //注册信号捕捉
    sigaction(SIGALRM, &act, NULL);

    struct itimerval new_value;
    //设置间隔时间
    new_value.it_interval.tv_sec = 2;
    new_value.it_interval.tv_usec = 0;
    //设置延迟时间, 3S后开始第一次定时
    new_value.it_value.tv_sec = 3;
    new_value.it_value.tv_usec = 0;

    int ret = setitimer(ITIMER_REAL, &new_value, NULL);
    if (ret == -1)
    {
        perror("setitimer err");
        exit(0);
    }
    printf("定时器开始了...\n");

    // getchar();
    while (1)
        ;

    return 0;
}

运行

$./sigaction 
定时器开始了...
捕捉到了信号的编号是: 14
xxxxxxx
捕捉到了信号的编号是: 14
xxxxxxx
...
...
^C

内核实现信号捕捉的过程

  1. 在内核中有阻塞信号集, 在我们信号捕捉处理当中, 会使用临时的阻塞信号集,当信号处理完毕会恢复到内核的阻塞信号集
  2. 在执行回调之前, 信号会默认被屏蔽掉, 等待前一个回调执行完毕
  3. 阻塞的常规信号是不支持排队的, 标志位同时只能记录一个

image

标签:int,18,act,value,信号,Linux,sa,sigaction
From: https://www.cnblogs.com/anqwjoe/p/17409753.html

相关文章

  • Linux多进程21-守护进程
    终端在UNIX系统中,用户通过终端登录系统后得到一个shell进程,这个终端成为shell进程的控制终端(ControllingTerminal),进程中,控制终端是保存在PCB中的信息,而fork()会复制PCB中的信息,因此由shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个......
  • Linux多进程02-进程状态转换
    进程状态三态模型:就绪态、运行态、阻塞态五态模型:新建态、就绪态、运行态、阻塞态、终止态新建态:进程刚被创建,未进入就绪队列就绪态:进程具备运行条件,等待系统分配处理器以便运行。可能会有多个,排成一个队列。运行态:进程占有处理器正在运行阻塞态:进程不具备运行条件,等待某......
  • Linux多进程04-父子进程虚拟地址空间
    调用fork函数后,相当于复制一份地址空间出来,父子进程代码段(.text)是相同的,但栈空间是没有关系的,它们依据各自栈空间的值执行各自的判断逻辑在内核区中,父进程和子进程的pid是不一样的父子进程的关系:fork()函数的返回值不同pcb(progresscontrolblock进程控制块)中......
  • Linux多进程06-进程退出、孤儿进程、僵尸进程
    进程退出#include<stdlib.h>voidexit(intstatus);#include<unistd.h>void_exit(intstatus);/*#include<stdlib.h>voidexit(intstatus);#include<unistd.h>void_exit(intstatus);status参数:进程退出时一个状态信息,父进程回收子进程资源时可以获得*......
  • Linux多进程05-exec函数族
    execl:执行文件函数#include<unistd.h>intexecl(constchar*pathname,constchar*arg,...); 执行参数path字符串所代表的文件路径参数:-path:需要指定的执行的文件的路径或者名称(推荐使用绝对路径)-arg:是执行可......
  • Linux多进程07-wait和waitpid
    进程回收在每个进程退出的时候,内核释放该进程所有的资源、包括打开的文件、占用的内存等。但是仍然为其保留一定的信息,这些信息主要主要指进程控制块PCB的信息(包括进程号、退出状态、运行时间等)。父进程可以通过调用wait或waitpid得到它的退出状态同时彻底清除掉这个进程。......
  • Linux多进程09-匿名管道实现ps aux
    /*实现psaux|grepxxx父子进程间通信子进程:psaux,子进程结束后将数据发送给父进程父进程:获取到数据,guolvpipe()execlp()子进程将标准输出stdout_fileno重定向到管道的写端dup2()*/#include<stdio.h>#include<stdlib.......
  • Linux多进程08-进程间通信与管道
    进程间通信进程是一个独立的资源分配单元,不同进程(这里所说的进程通常指的是用户进程)之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程的资源。不同的进程需要进行信息的交互和状态传递(如:数据传输/通知事件/资源共享/进程控制),因此需要进程间通信(IPC:Int......
  • Linux多进程11-内存映射
    内存映射(Memory-mappedI/O)是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。mmap#include<sys/mman.h>void*mmap(void*addr,size_tlength,intprot,intflags,intfd,off_toffset);功能:将一个文件或者设备的数据映射到内存中参数:......
  • Linux多进程10-有名管道实现简单版聊天功能
    chatA.c//有名管道实现简单版聊天功能#include<unistd.h>#include<stdio.h>#include<sys/types.h>#include<sys/stat.h>#include<stdlib.h>#include<fcntl.h>#include<string.h>intmain(intargc,charconst*argv[]){......