Linux系统调用之signal,sigaction函数

news/2024/11/7 23:45:34/

前言

如果,想要深入的学习Linux系统调用中的signal,sigaction函数,还是需要去自己阅读Linux系统中的帮助文档。

具体输入命令:

man 2 signal/sigaction

即可查阅到完整的资料信息。

signal 函数

signal()是一个用于处理Unix和类Unix操作系统(如Linux)中的信号的系统调用。信号是用于在进程间或者进程内部传递通知或者异常事件的机制。信号可以由用户按下某个键、硬件异常、软件中断或者其他进程产生。signal()系统调用允许进程捕获、忽略或者改变特定信号的默认处理行为。

函数原型:

#include <signal.h> //使用此函数需导入此头文件//该行代码定义了一个名为 sighandler_t 的新类型,
//这个新类型可以指向一个函数,函数无返回值,只有一个 int 类型的参数。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

参数:

  • int signum:指定要处理的信号。例如:SIGINT(终端中断)、SIGTERM(终止信号)等。
  • sighandler_t handler:一个函数指针,用于处理特定的信号。可以是一个用户定义的函数,或者特殊值SIG_IGN(忽略信号)和SIG_DFL(使用默认处理行为)。

返回值:

  • 如果成功,signal()返回之前的信号处理函数指针;否则,返回SIG_ERR,并设置errno以表示错误原因。

示例:

  • 下面是一个简单的C程序,使用signal()捕获SIGINT信号(当用户按下Ctrl+C时产生)并执行自定义处理函数。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>/*在 C 语言中,函数的名称就是指向函数的指针,因此 sigint_handler 代表函数自身的指针。在这个程序中,我们希望将 sigint_handler 函数指针传递给 signal 函数,使得 signal 函数在接收到 SIGINT 信号时,能够调用到 sigint_handler 函数来处理该信号。
*/
void sigint_handler(int sig) {printf("捕获到信号 %d\n", sig);
}int main() {signal(SIGINT, sigint_handler);while (1) {printf("等待信号...\n");sleep(1);}return 0;
}

请注意,signal()在不同的Unix和类Unix系统中的行为可能会有所不同。对于可移植性和更多功能,推荐使用sigaction()系统调用。

sigaction()函数

sigaction()是一个Linux系统调用,用于处理和控制信号。相比signal()函数,sigaction()提供了更强大且具有可移植性的信号处理能力。sigaction()可以让你定义捕获信号时的行为,包括设置信号处理函数和信号处理选项。

函数原型:

#include <signal.h> // 使用此函数,需导入此系统调用int sigaction(int signum, const struct sigaction *restrict act, struct sigaction *restrict oldact);

参数:

  • int signum:指定要处理的信号,例如:SIGINT(终端中断)、SIGTERM(终止信号)等。
  • const struct sigaction *restrict act:一个指向sigaction结构体的指针,该结构体包含信号处理函数和信号处理选项。如果为NULL,则不会改变信号的处理行为。
    struct sigaction *restrict oldact:一个指向sigaction结构体的指针,用于存储信号原有的处理行为。如果为NULL,则不会返回信号原有的处理行为。

返回值:

  • 成功时,返回0;
  • 失败时,返回-1,并设置errno以表示错误原因。

sigaction结构体:

struct sigaction {void (*sa_handler)(int);        // 信号处理函数void (*sa_sigaction)(int, siginfo_t *, void *); // 带有信号信息的信号处理函数sigset_t sa_mask;               // 在信号处理函数执行期间屏蔽的信号集int sa_flags;                   // 控制信号处理行为的标志位void (*sa_restorer)(void);      // 已过时,不建议使用
};

示例:

  • 下面是一个简单的C程序,使用sigaction()捕获SIGINT信号(当用户按下Ctrl+C时产生)并执行自定义处理函数。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>void sigint_handler(int sig) {printf("捕获到信号 %d\n", sig);
}int main() {struct sigaction sa;sa.sa_handler = sigint_handler;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if (sigaction(SIGINT, &sa, NULL) == -1) {perror("sigaction");exit(EXIT_FAILURE);}while (1) {printf("等待信号...\n");sleep(1);}return 0;
}

在这个示例中,我们设置了一个自定义的信号处理函数sigint_handler,用于在接收到SIGINT信号时执行。我们使用sigemptyset()初始化sa_mask,以防止在信号处理函数执行期间阻塞任何其他信号。sa_flags设置为0,表示我们使用默认的信号处理行为。最后,调用sigaction()设置信号处理函数。


http://www.ppmy.cn/news/56413.html

相关文章

Python lxml 库与 XPath 语法

lxml 库是 C 库 libxml2 和 libxslt 的 Python 绑定, 可处理 XML 和 HTML 文档, 支持 XPath 语法 解析 HTML 分两种情况: 解析 HTMl 文件 当前目录新建 simple.html 文件 <html lang"en"> <head><title>XPath</title> </head> &l…

【Redis】关于哨兵模式

连接步骤 一.客户端遍历所有的 Sentinel 节点集合,获取一个可用的 Sentinel 节点. 二.客户端向可用的 Sentinel 节点发送 get-master-addr-by-name 命令,获取Redis Master 节点. 三.客户端向Redis Master节点发送role或role replication 命令,来确定其是否是Master节点,并且能…

HR website

2023年最新招聘渠道一览表序号大 类小 类网 站 名网 址1综合类综合类企业总部人才网www.xzqrc.cn2前程无忧www.51job.com3智联招聘www.zhaopin.com4597招聘网www.597.com5中华英才网www.chinahr.com6一览英才网www.job1000.com7今日招聘招聘求职找工作_上今日招聘网站_找工作…

利用Bridge创建虚拟网络

利用Bridge创建虚拟网络 1 安装网桥模块。 # yum install -y bridge-utils(利用系统镜像文件作为本地YUM源&#xff0c;创建本地YUM源文件) 2 查询网桥模块。 # modinfo bridge ilename: /lib/modules/3.10.0-327.el7.x86_64/kernel/net/bridge/bridge.ko alias: …

【每日一题】4978:宠物小精灵之收服

目录 一&#xff1a;题目 二&#xff1a;分析 三&#xff1a;代码实现 一&#xff1a;题目 一天&#xff0c;小智和皮卡丘来到了小精灵狩猎场&#xff0c;里面有很多珍贵的野生宠物小精灵。小智也想收服其中的一些小精灵。然而&#xff0c;野生的小精灵并不那么容易被收服…

ATTCK v12版本战术介绍——防御规避(四)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术&#xff0c;本期我们为大家介绍ATT&CK 14项战术中防御规避战术第19-24种子技术&#xff0c;后续会介绍防御规避其他子技术&#xf…

【网课平台】Day16.项目优化:压测、加缓存优化与分布式锁

文章目录 一、压力测试1、优化需求2、性能指标3、安装Jmeter4、压力测试5、优化日志 二、缓存优化1、给接口加Redis缓存2、缓存穿透3、解决缓存穿透4、缓存雪崩5、缓存击穿 三、分布式锁1、本地锁的问题2、IDEA一个项目启动多个实例3、分布式锁4、Redis NX实现分布式锁5、Redis…

spring事务传播机制

目录标题 事务的传播机制&#xff08;7种&#xff09;REQUIRED举个例子 REQUIRES_NEW举个例子 SUPPORTS举个例子 NOT_SUPPORTED举个例子 MANDATORY举个例子 NEVER举个例子 NESTED举个例子 PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别 事务的传播机制&#xff08;7种&…