signalfd 是什么?
一、signalfd 是什么
信号(signal)本质是 Linux 进程间通信的一种机制,也叫软中断信号。signalfd 是一个跟信号关联的文件描述符,能够以 io 的行为获取到系统信号,属性上来讲 signalfd 也是一个匿名 fd 类型:
root@ubuntu:~# ll /proc/15445/fd
lrwx—— 1 root root 64 Aug 24 16:42 3 -> anon_inode:[signalfd]
root@ubuntu:~# cat /proc/15445/fdinfo/3
pos: 0
flags: 02
mnt_id: 11
sigmask: 0000000000000006
从这里可以得到简单的信息:
signal 用的匿名 inode ,signalfd 属于匿名 fd 的一种;句柄关联的重要信息就是 sigmask,通过 /proc/${pid}/fdinfo/3 能看到这个值其实信号是很讲究的,甚至有信号编程一说,Linux 的 signalfd 为信号的处理提供了一种新的方法,统一到文件的 io 模式,契合一切接文件的理念。
系统调用:
#include
int signalfd(int fd, const sigset_t *mask, int flags);
该系统调用返回一个整数类型 signalfd,这个句柄跟信号行为绑定,当发生信号的时候,句柄触发可读事件。
名列前茅个参数也可以传入一个有效的信号 fd 的句柄,如果传入的是 -1 ,那么内核会自动创建一个新的 fd 。
完整的代码例子,在 Linux 机器上,通过 man signalfd 就可以获取到。
信号能够像文件一样 read 出来,这种优雅的信号处理方式得益于 signalfd 的封装;信号是挂在在进程 task_struct 结构体上的,信号队列非空的时候 signalfd 句柄可读;和 epoll 池的配合同样还是老套路,epoll_ctl 注册的时候调用 .poll 接口挂载 epoll 的 wait entry 到 sighand->signalfd_wqh 之上,信号发送时()唤醒 epoll ;signalfd 也是一种匿名 fd 类型。延伸阅读:
二、信号的使用示例
我们通过一段代码实例来看一下信号量的使用吧。
void IntHandler(int signum) {
std::cout << time(NULL) << ” Got a int signal” << signum << std::endl;
std::this_thread::sleep_for(5s);
std::cout << time(NULL) << ” Fininsh int signal” << signum << std::endl;
}
int main(int argc, char* argv[]) {
signal(SIGINT, IntHandler);
while(true) {
std::this_thread::sleep_for(10s);
std::cout << “.” << std::endl;
}
std::cout << std::endl;
return 0;
}
上面这段代码,我们通过signal(SIGINT, IntHandler);自定义了SIGINT信号量的处理。程序运行起来后,当按下ctrl + c时,IntHandler信号处理函数被触发。
相关推荐HOT
更多>>MySQL中id通常使用什么数据类型呢?
一、MySQL中id通常使用什么数据类型一般都是 int 自增设置为主键如果表大的话可以设置为 龙, 或者big int例如:‘id’int unsigned not null a...详情>>
2023-10-15 22:12:14关系型数据库是什么?
一、什么是关系型数据库关系型数据库是按照关系模型组织和存储数据的数据库。它使用表格(表)的形式来表示和存储数据,每个表代表一个实体,而...详情>>
2023-10-15 21:32:39设计移动端表单有哪些注意事项?
1、分布式表单iPhone目前主要的机型屏幕尺寸在4.7-5.8英寸,android的尺寸更多一些,但是总体上来说,移动端的载体手机屏幕不大,能承载的信息...详情>>
2023-10-15 21:06:48APP开发过程中需要注意什么?
一、APP开发过程中需要注意什么1、了解需求:商家和企业在开发app的时候,首先要了解市场需求,也就是用户的需求,这点是最重要的,想要app软件...详情>>
2023-10-15 20:00:34热门推荐
为什么索引过的字段排序速度会很快,原理是什么?
沸为什么Python开发世界持续被Django统治那么久?
热Binder到底是什么?
热MySQL中id通常使用什么数据类型呢?
新关系型数据库是什么?
设计移动端表单有哪些注意事项?
开发一个生鲜商城APP软件可以解决哪些问题?
APP开发过程中需要注意什么?
图数据库的应用有哪些优点?
数据库中的视图有什么用?
数据库丢失数据的原因是什么?
Mysql、SQLite、Mongo的区别?
LayoutInflater.inflate()方法两个参数和三个参数的区别?
为什么要用flow?