0

特定の間隔の後に関数を呼び出してから続行するタイマーを1つ作成したいと思います。特定のプロセスが完了するたびに、このタイマーを停止したいと考えています。ここでは、特定の時間後に呼び出したい関数が 1 つありますが、この関数でパラメーターを渡したいと考えています。

このトピックに関する私の質問は以下のとおりです。

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

2 に答える 2

1

ここで一歩戻りたいと思うかもしれません。シグナルハンドラで安全に呼び出すことができる関数のセットは非常に限られています - signal(2)を参照してください。

1 つの方法は、単純にシグナル ハンドラーで (sig_atomic_t 型の) 変数をインクリメントし、このフラグを別の場所でチェックすることです。

于 2012-05-11T06:17:49.573 に答える
1

signal.h私の Linux システムでは、タイプは次のsighandlerように定義されています。

void (*__sighandler_t) (int)

つまり、sighandler(getP()あなたの例では) を返す関数へのポインタでなければなりませんvoid。Anintが渡されます -- シグナル番号です。そのため、シグナル ライブラリから他のパラメータを に渡す方法はありませんgetP()

これは、グローバルの場合のように見えます。

于 2012-05-11T06:19:53.630 に答える