sloop公共函数之添加信号,定时器及socket
1:添加信号
1.1 原型:sloop_handle sloop_register_signal(int sig, sloop_signal_handler handler, void * param)
/* register a signal handler */
sloop_handle sloop_register_signal(int sig, sloop_signal_handler handler, void * param)
{
struct sloop_signal * entry;
struct sigaction sa; sa.sa_handler = sloop_signals_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART; /* allocate a new structure sloop_signal */
entry = get_signal();
if (entry == NULL)
return NULL; /* setup structure and insert into list. */
entry->sig = sig;
entry->param = param;
entry->handler = handler;
dlist_add(&entry->list, &sloop.signals);
SLOOPDBG(d_dbg("sloop: sloop_register_signal(%d)\n", sig));
if (sigaction(sig, &sa, NULL) < ) {
dlist_del(&entry->list);
free_signal(entry);
d_error("sigaction %d error %s\n", sig, strerror(errno));
return NULL;
} return entry;
}
这个函数提供给使用sloop模块的第三方,只需要传入要监听的信号、信号处理函数、参数,就可以将此信号登记到sloop_data结构体中的struct dlist_head signals链表中,在sloop_run函数中进行监听。get_signal函数是从初始化时的struct dlist_head free_signals链表中取出一个可用的节点挂在struct dlist_head signals链表中。具体实现如下:
/* get signal from pool */
static struct sloop_signal * get_signal(void)
{
struct dlist_head * entry;
struct sloop_signal * target; if (dlist_empty(&sloop.free_signals)) {
d_error("sloop: no sloop_signal available !!!\n");
return NULL;
}
entry = sloop.free_signals.next;
dlist_del(entry);
target = dlist_entry(entry, struct sloop_signal, list);
target->flags = SLOOP_INUSED | SLOOP_TYPE_SIGNAL;
return target;
}
flags参数主要是为了标识此节点的类型,有三种类型,SLOOP_TYPE_SOCKET、SLOOP_TYPE_TIMEOUT、SLOOP_TYPE_SIGNAL。
1.2 一般使用方法
sloop_register_signal(SIGTERM, sig_term, NULL);登记SIGTERM信号的处理函数是sig_term,没有要传递的参数。
2:添加定时器
2.1 原型:sloop_handle sloop_register_timeout(unsigned int secs, unsigned int usecs, sloop_timeout_handler handler, void * param)
同添加信号的实现思路是一样的,需要传递的参数是定时器的秒和微妙参数。
/* register a timer */
sloop_handle sloop_register_timeout(unsigned int secs, unsigned int usecs, sloop_timeout_handler handler, void * param)
{
struct sloop_timeout * timeout, * tmp;
struct dlist_head * entry; /* allocate a new struct sloop_timeout. */
timeout = get_timeout();
if (timeout == NULL) return NULL; /* get current time */
gettimeofday(&timeout->time, NULL);
timeout->time.tv_sec += secs;
timeout->time.tv_usec += usecs; while (timeout->time.tv_usec >= ) {
timeout->time.tv_sec++;
timeout->time.tv_usec -= ;
}
timeout->handler = handler;
timeout->param = param;
INIT_DLIST_HEAD(&timeout->list); /* put into the list */
if (dlist_empty(&sloop.timeout)) {
dlist_add(&timeout->list, &sloop.timeout);
SLOOPDBG(d_dbg("sloop: timeout(0x%x) added !\n", timeout));
return timeout;
} entry = sloop.timeout.next;
while (entry != &sloop.timeout) {
tmp = dlist_entry(entry, struct sloop_timeout, list);
if (timercmp(&timeout->time, &tmp->time, < )) break;
entry = entry->next;
}
dlist_add_tail(&timeout->list, entry);
SLOOPDBG(d_dbg("sloop: timeout(0x%x) added !!\n", timeout));
return timeout;
}
2.2 一般使用方法
sloop_register_timeout(1, 0, wan_handler, param);在登记之后的1秒执行函数wan_handler。
3:添加套接字
3.1 原型:套接字分为监听可读或可写两种
/* register a read socket */
sloop_handle sloop_register_read_sock(int sock, sloop_socket_handler handler, void * param)
{
return register_socket(sock, handler, param, &sloop.readers);
} /* register a write socket */
sloop_handle sloop_register_write_sock(int sock, sloop_socket_handler handler, void * param)
{
return register_socket(sock, handler, param, &sloop.writers);
}
分别挂载到sloop.readers和sloop.writers链表上。
static struct sloop_socket * register_socket(int sock,
sloop_socket_handler handler, void * param, struct dlist_head * head)
{
struct sloop_socket * entry; /* allocate a new structure sloop_socket */
entry = get_socket();
if (entry == NULL) return NULL; /* setup structure and insert into list. */
entry->sock = sock;
entry->param = param;
entry->handler = handler;
dlist_add(&entry->list, head);
SLOOPDBG(d_dbg("sloop: new socket : 0x%x (fd=%d)\n", (unsigned int)entry, entry->sock));
return entry;
}
get_socket实现:
/* get socket from pool */
static struct sloop_socket * get_socket(void)
{
struct dlist_head * entry;
struct sloop_socket * target; if (dlist_empty(&sloop.free_sockets)) {
d_error("sloop: no sloop_socket available !!!\n");
return NULL;
}
entry = sloop.free_sockets.next;
SLOOPDBG(daig_printf("%s: get socket sd=[%x],\n", __FILE__, entry));
dlist_del(entry);
target = dlist_entry(entry, struct sloop_socket, list);
target->flags = SLOOP_INUSED | SLOOP_TYPE_SOCKET;
return target;
}
综上:
这就是这四种功能的实现思路及使用方式。
sloop公共函数之添加信号,定时器及socket的更多相关文章
- sloop公共程序之初始过程及启动
1:sloop_init() 初始化主要是初始化静态sloop_*** 结构体和填充struct sloop_data 结构体中的成员. //初始化静态存储区给sloop_***结构体 static ...
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pThreadCon = new CSerialThread ...
- sloop公共程序之总体描述
1:功能需求 开发一个公共库文件sloop.c,实现三个常用功能以供其它模块调用.三个功能如下: 功能一:实现一般的信号监听,调用模块只需传入要监听的信号和相应的回调函数就可以在信号到时调用回调函数处 ...
- 在Qt Creator 和在 vs2012 里添加信号和槽
原文地址:http://www.cnblogs.com/li-peng/p/3644812.html 作者:李鹏 出处:http://www.cnblogs.com/li-peng/ 本文版权归作者和 ...
- Postman高级应用——流程控制、调试、公共函数、外部数据文件
postman客户端下载地址:https://www.getpostman.com/apps 目录 流程控制 调试 公共函数 外部数据文件 流程控制 流程控制简言之就是设置接口的执行顺序,流程控制只有 ...
- VS2005 添加onTimer定时器
SetTimer(1,300,NULL); void CchangeDisplayDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息处理程序代码和/或调 ...
- phpcms公共函数库 总结
* global.func.php 公共函数库 /** * 返回经addslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed ...
- cmf公共函数解析
cmf公共函数解析-common.php 路径:thinkcmf\simplewind\cmf\common.php方法: 方法 作用 返回值 cmf_get_current_admin_id ...
- ThinkPHP 3.2.3 自动加载公共函数文件的方法
方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件 ...
随机推荐
- 在intelij IDEA中添加对jetBrick文件的识别
在intelij IDEA中添加对jetBrick文件的识别 打开setting, 搜索File Types, 在Recognized File Types窗口找到Java Server Page或者 ...
- Linux sync命令的作用分析
Sync命令 在用reboot命令启动unix系统后,系统提示出错信息,部分应用程序不能正常工作.经仔细检查系统文件,并和初始的正确备份进行比较,发现某些文件确实被破坏了,翻来覆去找不到文件遭破坏 ...
- HDU 5265 pog loves szh II 二分
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5265 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- Visual C++ 8.0对象布局
哈哈,从M$ Visual C++ Team的Andy Rich那里又偷学到一招:VC8的隐含编译项/d1reportSingleClassLayout和/d1reportAllClassLayout ...
- 敏捷冲刺DAY5
一. 每日会议 1. 照片 2. 昨日完成工作 发布和提供需求功能的实现 用户修改自己的信息 用户界面设计 管理员界面设计 3. 今日完成工作 4. 工作中遇到的困难 1.设置的背景无法显示. 2.一 ...
- 结对编程学习fault、error、failure三种状态
点滴成就 学习时间 新编写代码行数 博客量(篇) 学习知识点 第一周 10小时 0 0 了解软件工程 第二周 10小时 0 1 项目开题 第三周 15小时 0 1 开通博客.开展项目调查 第四周 20 ...
- (六)hadoop系列之__hadoop分布式集群环境搭建
配置hadoop(master,slave1,slave2) 说明: NameNode: master DataNode: slave1,slave2 ------------------------ ...
- 因为NLS_LANG 造成 Oracle数据库丢失 中文字符集兼容问题的处理.
接着上一封blog. 因为sqlplus的 乱码问题 我修改了 注册表里面 NLS_LANG 的 value值.主要改动为: NLS_LANG source: SIMPLIFIED CHINESE_C ...
- google auth
思路: secret 系统生成的密钥 把密钥分配给某个用户,用户可以把这个密钥加入到app中,app会1min生成一个code: 验证时,根据用户的 secret ,系统生成一个code,再比较用户输 ...
- js中如何获取页面的Url,域名和端口号
有时候通过获取上个页面的Url来做一个跳转,获取域名防止非正常访问 获取上一个页面的一个URL,这个URL一般做一个页面的跳转 window.location.href <script>w ...