2012-05-11 9 views
0

一定の間隔の後に自分の機能を呼び出すタイマーを作りたいと思います。 私の特定のプロセスが完了するたびに、このタイマーを停止します。 ここに私はある時間後に呼びたい1つの関数がありますが、この関数ではパラメータを渡したいと思います。Cのタイマーに混乱があります

私の質問は以下のとおりです。

  1. この関数にパラメータを渡すにはどうすればよいですか?
  2. この目標を達成する方法はありますか?

現在、このコードを使用しています。あなたが私の目標についてのアイデアを得るために、私がコードの間に書いた私のコードコメントを読んでください。

コード:

#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; 
} 

答えて

1

おそらく、ここに戻って一歩を踏み出すしたいです。シグナルハンドラで安全に呼び出すことができる一連の関数は非常に限定されています - signal(2)を参照してください。

シグナルハンドラの変数(sig_atomic_t型)をインクリメントし、このフラグを他の場所で調べるだけです。 (あなたの例ではgetP()sighandlervoidを返す関数へのポインタであることを有することを意味する

void (*__sighandler_t) (int) 

1

は私のLinuxシステム上のsignal.hでタイプsighandlerは、次のように定義されます。 intがシグナル番号に渡されます。したがって、信号ライブラリに他のパラメータをgetP()に渡す方法はありません。

これは、グローバルのケースのようです。

+0

getp()関数までパラメータを渡す規定はありますか? – user1089679

+0

いいえ。シグナルハンドラに任意のデータを渡す手段はありません。グローバルまたは静的な関数の外で定義された変数を使用することは、必然的に終了します。また、シグナルハンドラで何が安全であるかについて厳しい制限があります。標準Cはほとんど何も許さない。 POSIXでは、いくつかの関数を呼び出すことができますが、多くはそうではありません(そして 'printf()'は安全な集合の中にはありません)。 –

+0

@JonathanLefflerどうすればこのタイマーを停止できますか?ここで私はこのタイマー、これを行う正しい方法を停止するには、pauseTimer関数を使用していますか?シグナルのデフォルト値を設定する必要がありますか? – user1089679

関連する問題