sem_timedwait的用法
#include <semaphore.h>
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
Link with -pthread.
对于这个函数,主要在于abs_timeout这个参数。一开始我以为是传入需要等待的时间。像这样:
struct timespec ts;
ts.tv_nsec = ;
ts.tv_sec = ;
sem_timedwait(p_sem, &ts);
意思是我希望10秒1000纳秒才超时。结果,函数立即返回。网上查一下资料,才知道我错得多么离谱。这个abs_timeout竟然是UTC时间戳。看下面的代码http://linux.die.net/man/3/sem_timedwait:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <assert.h>
#include <errno.h>
#include <signal.h> sem_t sem; #define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while () static void
handler(int sig)
{
write(STDOUT_FILENO, "sem_post() from handler\n", );
if (sem_post(&sem) == -) {
write(STDERR_FILENO, "sem_post() failed\n", );
_exit(EXIT_FAILURE);
}
} int
main(int argc, char *argv[])
{
struct sigaction sa;
struct timespec ts;
int s; if (argc != ) {
fprintf(stderr, "Usage: %s <alarm-secs> <wait-secs>\n",
argv[]);
exit(EXIT_FAILURE);
} if (sem_init(&sem, , ) == -)
handle_error("sem_init"); /* Establish SIGALRM handler; set alarm timer using argv[1] */ sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = ;
if (sigaction(SIGALRM, &sa, NULL) == -)
handle_error("sigaction"); alarm(atoi(argv[])); /* Calculate relative interval as current time plus
number of seconds given argv[2] */ if (clock_gettime(CLOCK_REALTIME, &ts) == -)
handle_error("clock_gettime"); ts.tv_sec += atoi(argv[]); printf("main() about to call sem_timedwait()\n");
while ((s = sem_timedwait(&sem, &ts)) == - && errno == EINTR)
continue; /* Restart if interrupted by handler */ /* Check what happened */ if (s == -) {
if (errno == ETIMEDOUT)
printf("sem_timedwait() timed out\n");
else
perror("sem_timedwait");
} else
printf("sem_timedwait() succeeded\n"); exit((s == ) ? EXIT_SUCCESS : EXIT_FAILURE);
}
在这段代码中,他没有处理溢出,下面是我的代码:
int32 CSeamphoreLock::time_lock( int32 nano_sec,int32 sec )
{
struct timespec ts; if ( clock_gettime( CLOCK_REALTIME,&ts ) < )
return -; ts.tv_sec += sec;
ts.tv_nsec += nano_sec; //#define NSECTOSEC 1000000000
ts.tv_sec += ts.tv_nsec/NSECTOSEC; //Nanoseconds [0 .. 999999999]
ts.tv_nsec = ts.tv_nsec%NSECTOSEC; return sem_timedwait( m_psem,&ts );
}
PS:居然用的时间戳,如果正在等待的时候管理员调整时间会不会让某个程序出问题呢??为什么不用clock_gettime的CLOCK_MONOTONIC来判断呢。
sem_timedwait的用法的更多相关文章
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
随机推荐
- hdu 5167 Fibonacci(预处理)
Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...
- pyqt颜色字符
from PyQt4.QtGui import QPlainTextEdit, QWidget, QVBoxLayout, QApplication, \ QFileDialog, QMessageB ...
- Mac OS X 下修改网卡地址和抵御 ARP 攻击
用 Mac 系统有一段时间了,这里记录一下自己遇到的需要终端命令解决的问题. 网络环境绑定了原先机器的 MAC 地址,由于特殊原因,先把新机器的网卡地址改成原先那台. 在终端输入sudo ifconf ...
- Servlet登陆功能的实现
(1)创建动态的Login页面 //登陆界面 package com.lc; import javax.servlet.http.*; import java.io.*; public class L ...
- cp命令的编写——浅谈系统调用
摘要:linux中cp命令的实现,通过这个程序,我们需要了解系统调用耗费时间的方面,同时学会系统调用的错误处理机制. 本文来源:http://blog.csdn.net/trochiluses/art ...
- DataTable复制自身行
在我们工作的过程中有可能要使用DataTable产生一些重复数据(在不重复读取数据库的情况下) 无废话,直接上代码 DataTable复制自身一行(目的产生重复数据),已测试通过可直接复制 /// & ...
- Jquery:强大的选择器<二>
今天跟着资料做了一个示例,为什么我感觉自己做的没书上的好看呢?好吧,我承认自己对css样式只懂一点皮毛,我也不准备深度的去学习它,因为……公司有美工嘛! 这个小示例只是实现了元素的隐藏和显示.元素cl ...
- 事件监听:诀别Android繁琐的事件注册机制——view.setOnXXXXListener
本版本为1.0,支持较少,使用不够方便.相关封装逻辑结构已升级至2.0,详情可参见:更完善的安卓事件监听实现 先简单扯两句这几天学习下来对java事件监听机制的一点感触.客观地讲,java的事件监听机 ...
- AngularJs练习Demo10 ngInclude
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- EMCA常用命令 【weber整理必出精品】
EMCA常用命令 创建一个EM资料库 emca -repos create 重建一个EM资料库 emca -repos recreate 删除一个EM资料库 emca -repos drop 配置数据 ...