URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 25 » select的定时问题
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
select的定时问题
select的定时问题 - yeahnix [2005-09-22 15:03 | 2,169 byte(s)]
 
Re: select的定时问题 - lonelyflyer [2005-09-22 15:43 | 171 byte(s)]
 
Re: select的定时问题 - yeahnix [2005-09-22 17:46 | 244 byte(s)]
 
Re: select的定时问题 - lonelyflyer [2005-09-22 18:02 | 41 byte(s)]
 
Re: select的定时问题 - yeahnix [2005-09-23 12:53 | 3 byte(s)]
 
Subject: select的定时问题
Author: yeahnix    Posted: 2005-09-22 15:03    Length: 2,169 byte(s)
[Original] [Print] [Top]
应用程序定时一般可以使用alarm和setitimer,alarm可以认为是用setitimer中的ITIMER_REAL实现的,setitimer还有另外两种定时器,ITIMER_VIRTUAL, ITIMER_PROF,这三种定时器定时时间到的时候,向应用程序分别发送SIGALRM, SIGVTALRM, SIGPROF信号,因此可以设定对应的信号处理函数。
加入select来实现定时后,测试时发现一个问题,代码如下:

void sig_timer(int signo)
{
int esaved;
esaved = errno;
write(STDOUT_FILENO, "sig timer triggered ", 20);
errno = esaved;
}

int main(int argc, char * argv[])
{
struct timeval tv_timeout;
struct itimerval old, new;
int retval;

if (signal(SIGPROF, sig_timer) == SIG_ERR)
{
printf("Can't catch SIGPROF ");
}

new.it_interval.tv_usec = 0;
new.it_interval.tv_sec = 0;
new.it_value.tv_usec = 0;
new.it_value.tv_sec = (long int) 2;
if (setitimer (ITIMER_PROF, &new, &old) < 0)
{
printf("Set itimer wrong ");
}
else
{
printf("Set itimer success ");
}

tv_timeout.tv_sec = 3;
tv_timeout.tv_usec = 0;
retval = select (1, NULL, NULL, NULL, &tv_timeout);

if ((retval < 0) && (errno == EINTR))
{
printf(" signal interrupted select ");
}
else if( retval == 0)
{
printf("Time out of select ");
}


while(1)
;
return 0;
}

在上述代码中,程序在select后,先返回并打印消息,而信号处理函数似乎在select后又多等了两秒才触发,不知道是什么原因。
而如果将ITIMER_PROF改为ITIMER_REAL则运行正常,信号将中断select的运行。是否是select本身使用了setitimer,但是setitimer也只能使用一次阿

还请各位大侠赐教
----
just do it
[Original] [Print] [Top]
Subject: Re: select的定时问题
Author: lonelyflyer    Posted: 2005-09-22 15:43    Length: 171 byte(s)
[Original] [Print] [Top]
ITIMER_PROF是计算的当前进程占用的CPU时间,超出才触发

ITIMER_REAL才是一般的时间片

这点 select 阻塞和 whie(1); 循环的效果是完全不一样的
----
OpenH323 is buggy
ACE is memory greedy
[Original] [Print] [Top]
Subject: Re: select的定时问题
Author: yeahnix    Posted: 2005-09-22 17:46    Length: 244 byte(s)
[Original] [Print] [Top]
也就是说,实际上select阻塞时并没有和setitimer产生冲突,select阻塞和sleep效果差不多,对进程执行时间产生的影响很少。
btw:select阻塞实现的原理是什么样的呢?
看内核中的代码好像是直接schedule_timeout,在c库中是否有对阻塞的包装呢?
----
just do it
[Original] [Print] [Top]
Subject: Re: select的定时问题
Author: lonelyflyer    Posted: 2005-09-22 18:02    Length: 41 byte(s)
[Original] [Print] [Top]
C 库可以参考 linuxthreads 中的 spinlock.c
----
OpenH323 is buggy
ACE is memory greedy
[Original] [Print] [Top]
Subject: Re: select的定时问题
Author: yeahnix    Posted: 2005-09-23 12:53    Length: 3 byte(s)
[Original] [Print] [Top]
TKS
----
just do it
[Original] [Print] [Top]
« Previous thread
想开发radius客户端程序,请指点!
C/C++编程版
25
Next thread »
linux中有类似于进入临界区的函数吗?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:36, cost 0.047106981277466 ms.