一直未使用过的Linux API,还是要不停的学习啊
2015-11-16 14:35
609 查看
新的API eventfd、signalfd、timerfd
目前比较新的Linux 内核都支持这三个函数1、eventfd
#include <sys/eventfd.h> int eventfd(unsigned int initval, int flags);
eventfd() creates an "eventfd object" that can be used as an event wait/notify mechanism by user-space applications, and by the kernel to notify user-space applications of events. The object contains an unsigned 64-bit integer (uint64_t) counter that is maintained by the kernel. This counter is initialized with the value specified in the argument initval.查看man手册,大概的意思为通过内核通知 user-space的方式进行的,使用一个64-bit来作为值。flags (1)EFD_CLOEXEC 在出现exec时 主动关闭这个eventfdflags (2)EFD_NONBLOK 非阻塞flags (2) EFD_SEMAPHORE 函数返回一个文件描述符(eventfd object)eventfd 主要用于进程或者线程间通讯(通知、等待机制 nginx中有使用),实现方式为read、write来想eventfd中写入和读取。
2、timerfd
#include <sys/timerfd.h> int timerfd_create(int clockid, int flags); 返回一个timerfd int timerfd_settime(int fd, int flags, const struct itimerspec *new_value, struct itimerspec *old_value); 设置timer周期 int timerfd_gettime(int fd, struct itimerspec *curr_value); 得到到期时间结构体对应(来自man)
struct timespec { time_t tv_sec; /* Seconds */ longtv_nsec;/* Nanoseconds */ }; struct itimerspec { struct timespec it_interval; /* Interval for periodic timer */ struct timespec it_value; /* Initial expiration */ };
3、signalfd
#include <sys/signalfd.h>int signalfd(int fd, const sigset_t *mask, int flags);
signalfd是一个在linux kernel 2.6.22提供的系统调用,功能是使用一个fd来接收信号。这样就可以同步地处理信号,也不需要设置处理函数。可以man signa lfd 查看示例程序。首先必须使用sigprocmask来屏蔽要使用signalfd来处理的信号,然后调用signalfd创建一个fd用来读取到达的信号。当被屏蔽的信号到达时,程序将不会被中断,也不会有处理函数被调用。信号会在fd中排队。signalfd创建的fd可以和其他fd一样:可以放在select, poll, epoll中;可以设置为非阻塞;可以为不同的信号创建不同的fd;在fork之后该fd也不会关闭掉,子进程同样可以读懂发送给父进程的信号。signalfd非常适合在主循环中执行epoll处理大量连接的单进程网络服务程序中使用,信号的处理可以和其他fd一样加到epoll中。由于程序不会被中断,可以选择合适的时机才去处理信号
其实上面的三个函数创建的fd 都可以放在epoll中进行监听操作,完成非阻塞的操作,这样可以大大提高程序的处理性能,建议去使用。
相关文章推荐
- Linux 下 java 监控 程序运行
- Linux环境下 使用JXL生成Excel时发生java.lang.ArrayIndexOutOfBoundsException
- CentOS6.5 配置VNC配置
- 【CentOS 7】Linux 分区方案参考
- Linux pipe函数
- Linux中iptables设置详细
- 英特尔 QSV 在 FFMPEG 中的使用(Linux)
- linux c 信号量编程
- linux在某个文件目录下右击打开终端 的小工具安装
- Linux下mysql的root密码忘记解决方法
- Linux入门教程
- linux中send函数MSG_NOSIGNAL异常消息
- 哥这两天的工作切换到移植mpls-linux
- ns3中linux kernel的位置理解
- Linux下MySQL忘记root密码怎么办
- Linux常用tool的整理
- 第五天-linux基础命令
- Linux 偏门接口速记
- jenkins发布项目到远程主机上,配置两台linux如何使用SSH免密码登录
- centos下的日志