Chinaunix

标题: 求助 linux下有关时间间隔的问题 [打印本页]

作者: karl412    时间: 2007-05-09 14:32
标题: 求助 linux下有关时间间隔的问题
我想实现 在某一个时间间隔后 循环执行某一个动作

我尝试用
struct timeval time;
memset(&time, 0, sizeof(timeval));
time.tc_sec = 1;
time.tv_usec = 0;
select(NULL, NULL, NULL, NULL, &time);

但是系统提示
/usr/include/linux/time.h:9: redefinition of `struct timespec'
/usr/include/linux/time.h:19: syntax error before "suseconds_t"
/usr/include/linux/time.h:43: redefinition of `struct itimerspec'
/usr/include/linux/time.h:49: field `it_interval' has incomplete type
/usr/include/linux/time.h:50: field `it_value' has incomplete type

不知道大家还有什么其他的实现方法?

[ 本帖最后由 karl412 于 2007-5-9 14:56 编辑 ]
作者: ypxing    时间: 2007-05-09 14:40
原帖由 karl412 于 2007-5-9 14:32 发表
我想实现 在某一个时间间隔后 循环执行某一个动作

我尝试用
struct timeval time;
memset(&time, 0, sizeof(timeval));
time.tc_sec = 1;
time.tv_usec = 0;
select(NULL, NULL, NULL, NULL, &t ...


如果只要求到秒的话,用sleep吧
作者: karl412    时间: 2007-05-09 14:42
是这样的 我在每一秒钟 让一个进程发30个包 但是发完这30个包 并不需要1秒钟 所以剩下的时间 我希望他等待 等到下一秒开始 ---- 也就是实现 每一秒发送30个包

如果是sleep的话 这一秒 不能执行任何动作
作者: ypxing    时间: 2007-05-09 14:49
原帖由 karl412 于 2007-5-9 14:42 发表
是这样的 我在每一秒钟 让一个进程发30个包 但是发完这30个包 并不需要1秒钟 所以剩下的时间 我希望他等待 等到下一秒开始 ---- 也就是实现 每一秒发送30个包

如果是sleep的话 这一秒 不能执行任何动作


你上面select的用法跟sleep的区别就是它更精确
还有就是你没有办法事先判断每次发完这30个包是不是都在1秒内

如果假设每次都在一秒内的话,
你需要:
计算发送30个包花了多少时间;
然后用select来等待1秒减去上面的时间.
作者: karl412    时间: 2007-05-09 14:55
嗯 刚刚查了一下《UNIX环境高级编程》 的确是我记错了
select相当于sleep

那我想实现 在某一时间区域内 比如说5秒内 让程序发送10个包 然后下5秒 再发送10个包 如此循环下去
我该如何实现呢? 如何控制程序实现这样的流程?

我开始试图使用
time_t curtime;
time_t lasttime;
time_t elapse;
lasttime = 0;
while(1)
{
      time(&curtime);
      if((curtime - lasttime) > elapse){            
             run();/*执行动作*/
       lasttime = curtime;
      }
}

我开始使用这样的模式尝试 不过我使用ctime打印出elapse的结果
是一个日期 我如果想让他每5秒就run()一次 我该如何设置我的elapse?

[ 本帖最后由 karl412 于 2007-5-9 15:03 编辑 ]
作者: ypxing    时间: 2007-05-09 15:00
原帖由 karl412 于 2007-5-9 14:32 发表
我想实现 在某一个时间间隔后 循环执行某一个动作

我尝试用
struct timeval time;
memset(&time, 0, sizeof(timeval));
time.tc_sec = 1;
time.tv_usec = 0;
select(NULL, NULL, NULL, NULL, &t ...


试试下面的代码

#include <sys/select.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
  struct timeval mytime;
  mytime.tv_sec = 1;
  mytime.tv_usec = 0;
  select (0, NULL, NULL, NULL, &mytime);
  printf ("wait successfully\n");
  
}
作者: karl412    时间: 2007-05-09 15:06
原帖由 ypxing 于 2007-5-9 15:00 发表


试试下面的代码

#include <sys/select.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
  struct timeval mytime;
  mytime.tv_sec = 1;
  mytime.tv_usec = 0;
  sel ...



谢谢你的关注

你的这个程序相当于是sleep(1);
我刚刚认真修改了一下我的回复

那我想实现 在某一时间区域内 比如说5秒内 让程序发送10个包 然后下5秒 再发送10个包 如此循环下去
我该如何实现呢? 如何控制程序实现这样的流程?

我开始试图使用
time_t curtime;
time_t lasttime;
time_t elapse;
lasttime = 0;
while(1)
{
      time(&curtime);
      if((curtime - lasttime) > elapse){            
             run();/*执行动作*/
       lasttime = curtime;
      }
}

我开始使用这样的模式尝试 不过我使用ctime打印出elapse的结果
是一个日期 我如果想让他每5秒就run()一次 我该如何设置我的elapse?


实现的并不是等待一秒 而是在每一秒的时间间隔里 都发送指定的数据包 实现每秒发送指定数据包的功能
作者: ypxing    时间: 2007-05-09 15:09
原帖由 karl412 于 2007-5-9 15:06 发表



谢谢你的关注

你的这个程序相当于是sleep(1);
我刚刚认真修改了一下我的回复

那我想实现 在某一时间区域内 比如说5秒内 让程序发送10个包 然后下5秒 再发送10个包 如此循环下去
我该如何实现呢? 如 ...


看看下面这个链接吧:
http://fanqiang.chinaunix.net/a4/b2/20010508/113412.html

利用下面两个函数应该可以帮助你
       #include <sys/time.h>

       int getitimer(int which, struct itimerval *value);
       int setitimer(int which, const struct itimerval *value,
                     struct itimerval *ovalue);

[ 本帖最后由 ypxing 于 2007-5-9 15:12 编辑 ]
作者: karl412    时间: 2007-05-09 15:20
再次谢谢你的关注

问题在于
#include <linux/time.h>
会报错
/usr/include/linux/time.h:9: redefinition of `struct timespec'
(见一楼)

如果
#include <sys/time.h>
也会报错timeval undeclared

郁闷ING
作者: ypxing    时间: 2007-05-09 15:26
原帖由 karl412 于 2007-5-9 15:20 发表
再次谢谢你的关注

问题在于
#include <linux/time.h>
会报错
/usr/include/linux/time.h:9: redefinition of `struct timespec'
(见一楼)

如果
#include <sys/time.h>
也会报错timeval  ...


我下面这段代码不会报错呀
#include <sys/time.h>
#include <stdlib.h>

int
main (int argc, char *argv[])
{
  struct timeval mytime;
  mytime.tv_sec = 2;
  mytime.tv_usec = 0;
  printf ("no error\n");
  
}

不知道你的怎么回事
作者: converse    时间: 2007-05-09 15:31
我想
>>struct timeval time;

变量time重名了
作者: karl412    时间: 2007-05-09 15:47
原帖由 converse 于 2007-5-9 15:31 发表
我想
>>struct timeval time;

变量time重名了



谢谢converse和ypxing  问题已经解决了!!

if(timeuse < 2.0){
                                
            }else{
                printf("Begin a new loop! \n");
                break;
            }

我开始加了一句打印 忘记加括号了 -_-!  低级错误




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2