2012-04-17 70 views
4

我们想在Linux平台下为我们的C程序添加一个定时器。如何在c中实现一个计时器?

我们正在尝试发送数据包,我们想要知道在1分钟内发送了多少数据包。我们希望计时器与while循环同时运行,以发送数据包正在执行。例如:

while(1)  
    {  
     send packets;  
    } 

此循环将继续发送数据包,直到按下ctrl-z。计时器应该用于在60秒后停止循环。

+0

为什么不只是fork()并让子进程监视父进程? – AoeAoe 2012-04-17 12:50:15

回答

-2

人3睡眠:

名称 睡眠 - 睡眠指定的秒数

概要 的#include < unistd.h>中

unsigned int sleep(unsigned int seconds); 
+0

这并不是提问者想要的。 – orlp 2012-04-17 11:14:35

+0

@nightcracker其实,它确实。通过创建一个新线程并使其休眠60秒,您会知道当线程运行完成后,60秒就会启动。他真的不应该使用他的测试代码来将他的计时码内联,所以这个答案是适当的,即使这不是我做这件事的方式。 – 2012-04-17 11:16:48

+0

@Sac Jacinto:没有。创建一个像这样的线程来回溯到原始线程只是为了使用睡眠,这是一个错误解决方案的蹩脚借口。 OP应该使用定时器,而不是睡觉的东西。 – orlp 2012-04-17 11:18:31

5

只需检查循环的每次迭代的时间,当1分钟过去时,请计算您发送的数据包数量。

编辑更改为反映问题实际要求的内容!

time_t startTime = time(); // return current time in seconds 
int numPackets = 0; 
while (time() - startTime < 60) 
{ 
    send packet 
    numPackets++; 
} 
printf("Sent %d packets\n", numPackets); 
+1

如果您正在对任何事物进行基准测试,那么将您的计时机制纳入基准测试时间并不是最好的想法。 – 2012-04-17 11:10:26

+0

如果发送一个数据包需要100秒,那么此代码将声明发送了一个数据包,而实际上在60秒过去之前没有数据包发送。这是误导,我认为你应该增加一个额外的计时器检查,然后再增加numPackets。或者,在柜台上使用开始传输,另一个用于完成传输。 – Lundin 2012-04-17 12:35:47

+0

@San Jacinto:简单就是美丽。 – JeremyP 2012-04-17 13:42:24

6

你可以做这样的事情:

#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 

volatile int stop=0; 

void sigalrm_handler(int sig) 
{ 
    stop = 1; 
} 

int main(int argc, char **argv) 
{ 
    struct sigaction sact; 
    int num_sent = 0; 

    sigemptyset &sact.sa_mask); 
    sact.sa_flags = 0; 
    sact.sa_handler = sigalrm_handler; 
    sigaction(SIGALRM, &sact, NULL); 

    alarm(60); /* Request SIGALRM in 60 seconds */ 
    while (!stop) { 
     send_a_packet(); 
     num_sent++; 
    } 

    printf("sent %d packets\n", num_sent); 
    exit(0); 
} 

如果循环的开销原来是过多的,你可以通过每次迭代发送N个数据包,并用N递增计数每次迭代分摊开销。

1

这里是itimer的代码片段,可以在Linux平台上使用不同的时间间隔在C:

#include <signal.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <sys/time.h> 

    void timer_handler (int signum) 
    { 
    static int count = 0; 
    printf ("timer expired %d times\n", ++count); 
    } 

    int main() 
    { 
     struct sigaction sa; 
     struct itimerval timer; 

     /* Install timer_handler as the signal handler for SIGVTALRM. */ 
     memset (&sa, 0, sizeof (sa)); 
     sa.sa_handler = &timer_handler; 
     sigaction (SIGVTALRM, &sa, NULL); 

     /* Configure the timer to expire after 1 sec... */ 
     timer.it_value.tv_sec = 1; 
     timer.it_value.tv_usec = 0; 
     /* ... and every 1000 msec after that. */ 
     timer.it_interval.tv_sec = 1; 
     timer.it_interval.tv_usec = 0; 
     /* Start a virtual timer. It counts down whenever this process is 
     * executing. */ 
     setitimer (ITIMER_VIRTUAL, &timer, NULL); 

     /* Do busy work. */ 
     while (1); 
      sleep(1); 
    } 

希望这将有助于。