首页 > 系统相关 >Linux——信号处理函数sigaction()

Linux——信号处理函数sigaction()

时间:2024-02-02 14:12:44浏览次数:29  
标签:函数 int 信号处理 Linux sa sigaction void

sigaction()
作用:设置某信号的信号处理函数

1. sigaction()函数原型
#include <signal.h>
int sigaction ( int signo,
const struct sigaction* restrict act,
struct sigaction* restrict oldact
);
1
2
3
4
5
signo:指定的信号,可以为除SIGKILL 及SIGSTOP外的任何信号
act:信号处理方式
oldact:旧的信号处理方式 将存储到此指针指向的结构体中
sigaction()函数只能在POSIX支持的系统上使用(POSIX:Portable Operating System Interface of UNIX,可以指操作系统接口。其定义了操作系统应该为应用程序提供的标准接口)
2. sigaction结构体
struct sigcation
{
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t*, void*);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
1
2
3
4
5
6
7
8
sa_handler:与signal()函数的handler参数相同,主要用于对signal()信号的支持
sigaction:新的信号处理函数指针。该信号处理函数应带有三个参数,类型分别为int,struct siginfo,void,返回值为void。
– 第一个参数为信号值;
– 第二个参数为指向结构体siginfo的指针,此结构体中包含信号的信息;
– 第三个参数没有使用
sa_mask:信号集,执行信号处理函数时,暂时将信号集中的信号搁置。默认为当前信号。
sa_flags:标志位,用于设置信号处理的其他相关操作
– SA_SIGINFO:使用sa_sigaction作为信号处理函数
– SA_NODEFER:在执行信号处理函数时,不阻塞当前信号
– SA_RESETHAND:当用户注册的信号处理函数被执行过一次后,该信号的处理函数被设为系统默认的处理函数
– SA_RESTATR:由此信号中断的系统调用会自动重启
– SA_INTERRUPT:由此信号中断的系统调用不会自动重启
– 其他
sa_restorer:此参数没有使用
3. siginfo结构体
struct siginfo {
int si_signo; /* signal number */
int si_errno; /* if nonzero, errno value from <errno.h> */
int si_code; /* additional info (depends on signal) */
pid_t si_pid; /* sending process ID */
uid_t si_uid; /* sending process real user ID */
void *si_addr; /* address that caused the fault */
int si_status; /* exit value or signal number */
long si_band; /* band number for SIGPOLL */
/* possibly other fields also */
};
1
2
3
4
5
6
7
8
9
10
11
4. 应用示例
/*sigcation() test*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>

void new_handle(int, siginfo_t*, void *);

int main()
{
struct sigaction act;
int sig;
//设置结构体sigaction的值
sigemptyset(&act.sa_mask);
act.sa_flags=SA_SIGINFO; //使用sa_sigaction作为信号处理函数
act.sa_sigaction=new_handle;
//设置要捕捉的信号
sig=SIGINT;

if(sigaction(sig, &act, NULL)<0)
{
perror("install signal error");
return -1;
}
while(1)
{
sleep(2);
printf("wait for the signal\n");
}
return 0;
}
//信号处理函数
void new_handle(int signo, siginfo_t* siginfo, void *rest)
{
printf("new handle get a signo ~\n");
exit(0);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
运行结果:

每隔两秒打印一次“wait for the signal”,在键盘上按下CTRL+C后,跳到new_handle()函数里打印“new handle get a signo~”之后再退出。

参考:

信号之sigaction函数
sigaction用法实例
sigaction函数解析
sigaction函数使用实例
Linux 进程------sigaction 函数解析
POSIX
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/iknow_nothing/article/details/84306084

 

标签:函数,int,信号处理,Linux,sa,sigaction,void
From: https://www.cnblogs.com/im18620660608/p/18003071

相关文章

  • Linux批量转换图片文件(png/jpg)
    ImageMagick转换图片一、convert命令Version:ImageMagick6.9.11-60Q16x86_642021-01-25https://imagemagick.orgCopyright:(C)1999-2021ImageMagickStudioLLCLicense:https://imagemagick.org/script/license.phpFeatures:CipherDPCModulesOpenMP(4.5)Delega......
  • Linux进程通信-POSIX IPC
    前言LinuxPOSIXIPC的可移植性是不如SystemVIPC的,但是我们只用Linux,并且内核版本高于2.6.6的话就不存在该问题了。也因为POSIXIPC出现的比较晚,借鉴了systemVIPC的长处,规避其短处,使得POSIXIPC的接口更易用。进程间通信的手段很多,除了消息队列、信号量、共享内存,还有信号、so......
  • linux系统mysql下载安装(二进制下载)
    最近在重新学习测试的基础知识,刚好学到数据库这一章,打算搭建一套linux系统上搭建mysql的服务端,简单做个记录,今天主要了解了二进制下载CentOs默认使用的软件包管理器是yum,我是用的是CentOs7,执行安装命令为:sudoyuminstallmysql-server,但是在安装的时候遇到问题,提示“没有可用软......
  • linux基础命令(三)
    •Linux命令–用来实现某一类功能的指令或程序执行大多数命令,都要找到相应的程序[root@localhost~]#ls/usr/bin/hostname/usr/bin/hostname#绿色可以执行的程序[root@localhost~]#–命令的执行依赖于解释器(默认解释器:/bin/bash)用户------->解释器--......
  • Linux系统编程49 信号 - sigprocmask() 设置信号集当中信号的mask信号屏蔽字
    sigprocmask():虽然我不知道信号什么时候来,但是我可以决定什么时候响应信号信号集:NAMEsigemptyset,sigfillset,sigaddset,sigdelset,sigismember-POSIXsignalsetoperationsSYNOPSIS#include<signal.h>intsigemptyset(sigset_t*set);清空信号集intsigfi......
  • Linux中国开源社区停止运营
    layout:posttitle:"Linux中国开源社区停止运营"tags:-"Linux"昨天看到老王发的公众号文章,Linux中国开源社区停止运营了。关注到「硬核老王」是近几年的事,也经常看一些Linux中国公众号上的文章以及视频号视频。去年在深度开源之夜有幸与老王有过一面之缘。看到消息感觉......
  • Linux下通过AnySetup配置NFS Server
       NFSServer主界面Add(添加配置)AddHost(添加客户端主机) AddHost界面EditHost(修改客户端主机) EditHost界面DeleteHost(删除客户端主机)选中回车要删除的客户端主机,然后选中回车“OK”按钮即可 DeleteHost界面Edit(修改配置)AddHost(添加客户端主机)......
  • Linux保存进程状态
    下面这个命令:ps-e|grepgsd|awk'{print$1}'|xargs-I{}sh-c'cat/proc/{}/status&&echo"-------------------------------------------"'>status.txt用于获取系统中所有进程名称中包含"gsd"的进程的状态,并将结果保存到名为"status.......
  • Nexus系列:简介和安装(Windows、Linux)以及反向代理Nexus
    目录简介安装WindowsLinuxNexus相关命令Nginx反向代理Nexus简介SonatypeNexus是一个Maven仓库管理器,可以节省网络带宽并加速项目搭建的进程。它可以管理jar包的仓库,包括上传和下载jar包。此外,SonatypeNexus还可以配置其他远程maven仓库站点,作为公共maven仓库的专用代理服务器,......
  • linux常见问题
    一、依赖包安装1.1离线安装在无网环境部署服务器时,需要离线安装很多软件,如gcc,cmake,tmux等,这时就要提前在有网环境下下载离线安装包。有的软件只需要一个单独的deb包安装即可,如net-tools,而有的软件有很多的依赖包,如gcc,这时就需要一个简单的方法来批量下载所有依赖deb包。这......