5

Linux プラットフォームで C プログラムにタイマーを追加したいと考えています。

パケットを送信しようとしていますが、1 分間に送信されるパケットの数を知りたいと考えています。whileパケットを送信するためのループが実行されているのと同時に、タイマーが実行されるようにします。例えば:

    while(1)    
    {     
      send packets;    
    }

このループは、ctrl-z が押されるまでパケットを送信し続けます。タイマーを使用して、60 秒後にループを停止する必要があります。

4

7 に答える 7

8

次のようなことができます。

#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 ずつインクリメントすることで、オーバーヘッドを償却できます。

于 2012-04-17T14:24:37.820 に答える
6

ループの繰り返しごとに時間を確認し、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);
于 2012-04-17T11:05:03.993 に答える
4

このhttp://www.gnu.org/software/libc/manual/html_node/Setting-an-Alarm.htmlをチェックして、プロセスにシグナルを送信するタイマーを設定し、while ループを停止することもできます。

于 2012-04-17T11:00:32.050 に答える
2

標準time()機能を見てください。

于 2012-04-17T10:58:44.343 に答える
-2

男3睡眠:

NAMEsleep-指定された秒数の間スリープします

概要#include<unistd.h>

   unsigned int sleep(unsigned int seconds);
于 2012-04-17T10:57:57.893 に答える