在C的计时器中有一些困惑

时间:2012-05-11 06:01:19

标签: c linux timer

我想制作一个在一定间隔后调用我的函数的计时器然后继续。 每当我的具体过程完成,我想停止这个计时器。 这里我有一个函数,我想在一定时间后调用,但我想在这个函数中传递参数。

我的问题如下。

  1. 如何将参数传递给此函数?
  2. 有没有办法实现这个目标。
  3. 目前我正在使用此代码。请阅读我在代码之间编写的代码注释,以便了解我的目标。

    代码:

    #include <stdio.h>
    #include <sys/time.h>
    #include <sys/wait.h>
    #include <signal.h>
    
    int main()
    {
        int result = 10;
        int i =0;
    
        // here I make timer which calls getP() function and I want to pass some
        // parameter to my getP function from here.
        // I don't want to make these variables global.
        initSigaction();
        initTime();
        // other process thread. If this process will be completed then I have to stop timer.
        pauseTime();
    }
    
    void initSigaction(void)
    {
        struct sigaction act;
        act.sa_handler = getP;//;
        act.sa_flags = 0;
        sigemptyset(&act.sa_mask);
        sigaction(SIGPROF, &act, NULL);
    }
    
    void initTime(void)
    {
        struct itimerval val;
        //printDebugLog(WIFI,"Timer value : %d",TIMER);
        val.it_value.tv_sec = 1;
        val.it_value.tv_usec = 0;
        val.it_interval = val.it_value;
        printf("\nProgress Timer started\n");
        setitimer(ITIMER_PROF, &val, NULL);
    }
    
    
    void getP()
    {
        // I want to get some parameter from main function and want to do some
        // calculation on this.  How can I get that parameter?
        printf("HI Hello");
    }
    
    int pauseTime(void)
    {
        struct itimerval val;
        val.it_value.tv_sec = 0;
        val.it_value.tv_usec = 0;
        val.it_interval = val.it_value;
        setitimer(ITIMER_PROF, &val, NULL);
        printf("\n Stop Progress Timer\n");
        return EXIT_SUCCESS;
    }
    

2 个答案:

答案 0 :(得分:1)

你可能想在这里退一步;您可以在信号处理程序中安全地调用的函数集非常有限 - 请参阅signal(2)

一种策略只是在信号处理程序中增加一个变量(类型为sig_atomic_t),并在其他位置检查此标志。

答案 1 :(得分:1)

在我的Linux系统的signal.h中,类型sighandler定义为:

void (*__sighandler_t) (int)

这意味着sighandler(示例中为getP())必须是指向返回void的函数的指针。传递int - 信号编号。因此,没有办法让信号库将任何其他参数传递给getP()

这看起来像全局变量。