#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的用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. 集成Dubbo服务(Spring)

    Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...

  2. Eclipse中Cannot find any provider supporting DES解决之道

    原文出处:http://blog.csdn.net/darwinchina/article/details/12037999 异常: Caused by: java.security.NoSuchAl ...

  3. top 命令SQLServer-sybase-oracle

    SQLServer: select top 10 * from tablename; select top 10 percent from tablename; select * from table ...

  4. C#重写Equals方法步骤

    检查传入的参数是否为null, 如果为null,那么返回false, 否则执行步骤2 调用ReferenceEquals查看是否为统一个对象,如果是,那么返回true, 否则执行步骤3 判断两者是否为 ...

  5. [JS]九种网页弹窗代码

    [1.最基本的弹出窗口代码] 其实代码非常简单: <SCRIPT LANGUAGE="javascript"><!--window.open ("pag ...

  6. 异步编程设计模式Demo - PrimeNumberCalculator

    using System; using System.Collections; using System.Collections.Specialized; using System.Component ...

  7. Log4net从下载到使用例子

    一.首先下载log4net.dll   http://pan.baidu.com/s/1gdigrwJ 二.添加log4net引用 三.代码: using System; using System.C ...

  8. 必须弄懂的495个C语言问题

    1.1 我如何决定使用那种整数类型? 如果需要大数 值(大于32, 767 或小于¡32, 767), 使用long 型.否则, 如果空间很重要(如有大数组或很多结构), 使用short 型.除此之外 ...

  9. hdu 1255 覆盖的面积

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 #include <cstdio> #include <cstring> #inc ...

  10. spoj 104 Highways (最小生成树计数)

    题目链接:http://www.spoj.pl/problems/HIGH/ 题意:求最小生成树个数. #include<algorithm> #include<cstdio> ...