0

main から関数 initialize_timer を 2 回定義して呼び出します。成功するか失敗するかは、この同じ関数を 2 回呼び出す順序によって異なります。つまり、initialize_timer から timer_settime を呼び出すと、1 回目は 0 が返されます。2 回目は -1 を返します。

繰り返しますが、関数 initialize_timer を 2 回呼び出すと、関数 timer_settime の呼び出しはエラー 1 で戻ります。2 つの呼び出しの順序を単純に逆にすると (以下のメインを参照)、エラーなしで返されます (戻り値として 0)。

関数 initialize_timer のすべての変数はローカル変数であるため、main で calloc を呼び出す方法にエラーがあると思います。

誰かがバグが何であるか教えてもらえますか?

initialize_timer 関数で関数 timer_setttime の 2 回目の呼び出しが失敗するのはなぜですか?

前もって感謝します。

void initialize_timer(timer_t * tid, int seconds)
{    
    struct itimerspec * ts;
    struct sigaction *  sa;
    struct sigevent *  sev;
    ts = malloc(sizeof(struct itimerspec));
    sa = malloc(sizeof(struct sigaction));
    sev = malloc(sizeof(struct sigevent));
    if (tid == NULL)
        fprintf(stderr,"malloc");

        /* Establish handler for notification signal */

    sa->sa_flags = SA_SIGINFO;
    if(seconds == 2){
        sa->sa_sigaction = producer;
        printf("producer was created\n");
    }
    if(seconds == 6){
        sa->sa_sigaction = consumer;
        printf("consumer was created\n");
    }
    sigemptyset(&sa->sa_mask);
    if (sigaction(TIMER_SIG, sa, NULL) == -1)
        fprintf(stderr,"sigaction");

    /* Create and start one timer for each command-line argument */

    sev->sigev_notify = SIGEV_SIGNAL;    /* Notify via signal */
    sev->sigev_signo = TIMER_SIG;        /* Notify using this signal */

    itimerspec( ts, seconds);

    sev->sigev_value.sival_ptr = &tid;
    /* Allows handler to get ID of this timer */

    if (timer_create(CLOCK_REALTIME, sev, tid) == -1)
        fprintf(stderr,"timer_create");

    int error=timer_settime(tid, 0, ts, NULL) == -1;
    if (error!=0)
        fprintf(stderr,"error timer_settime");

}


int main(int argc, char *argv[])
{
    pthread_t t1, t2;
    int s = 0;
    timer_t *tidlist;
    tidlist = calloc(2, sizeof(timer_t));
    if (tidlist == NULL)
        fprintf(stderr, "malloc");

    create_threads(&t1, &t2);

    initialize_timer(tidlist + 1, 6); //initilize timer for consumer
    initialize_timer(tidlist, 2); //initilize timer for producer

    s = pthread_join(t1, NULL);
    if (s != 0)
        fprintf(stderr, "pthread_join");
    s = pthread_join(t2, NULL);
    if (s != 0)
        fprintf(stderr, "pthread_join");

    printf("glob = %d\n", glob);
    return 1;
}


void itimerspec(struct itimerspec *tsp, int seconds){
    tsp->it_value.tv_sec = seconds;
    tsp->it_value.tv_nsec = 0;
    tsp->it_interval.tv_sec = seconds;
    tsp->it_interval.tv_nsec = 0;
}
4

1 に答える 1

0

基本的に2つの間違いがあります:

  1. sigaction同じスレッド (メイン スレッド) で 2 回呼び出しています。これは、1 つのシグナル ハンドラー (最後のハンドラー) のみをインストールすることを意味します。

  2. timer_t *最初のパラメーター a (ポインター) notとして timer_settime を指定していtimer_tます。コンパイラで警告を有効にする必要があります。あなたが not を与えtidていたとしても、あなたは によって作成されたので*tid、両方の場合で同じ値を与えるでしょう。tidlistcalloctidlist[0] == tidlist[1] == 0

于 2013-10-16T13:03:11.067 に答える