全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

signalfd 是什么?

发布时间:2023-10-11 14:55:11
发布人:xqq

一、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信号处理函数被触发。

#it技术干货

相关文章

JButton的e.getSource()和e.getActionCommand()方法有什么区别?

JButton的e.getSource()和e.getActionCommand()方法有什么区别?

2023-10-11
App测试中ios和Android有什么区别?

App测试中ios和Android有什么区别?

2023-10-11
软件库与框架有什么区别?

软件库与框架有什么区别?

2023-10-11
insmod 和 modprobe有什么区别?

insmod 和 modprobe有什么区别?

2023-10-11

最新文章

常见网络安全面试题:Windows常用的命令有哪些?

常见网络安全面试题:Windows常用的命令有哪些?

2023-10-09
常见网络安全面试题:根据设备告警如何展开排查?

常见网络安全面试题:根据设备告警如何展开排查?

2023-10-09
常见网络安全面试题:mysql加固呢?(数据库加固)

常见网络安全面试题:mysql加固呢?(数据库加固)

2023-10-09
常见网络安全面试题:windows和linux加固?(操作系统加固)

常见网络安全面试题:windows和linux加固?(操作系统加固)

2023-10-09
在线咨询 免费试学 教程领取