1

そのため、このコードは、Lubuntu12.04システムに移行することを決定した最近まで問題なく機能していました。timer_settimeを呼び出すとEINVALが返され、gdbで実行すると、呼び出された時点でtsのすべてのフィールドが0から999999999の範囲内にあることを確認しました。

1067        if(-1 ==timer_settime(tid,0,&ts,NULL))
(gdb) print ts
$1 = {it_interval = {tv_sec = 0, tv_nsec = 200000000}, it_value = {tv_sec = 0,
tv_nsec = 0}}

これがEINVALを返す原因となる唯一のものであるはずなので、私は非常に困惑しています。たぶん、私が行方不明になっていることがここに明らかな何かがあります。

struct sigevent sev;
struct itimerspec ts;
timer_t *tid;
//actually point the pointer at something.
tid = calloc(1,sizeof(timer_t));
//make sure there's no garbage in the structures.
memset(&sev,0,sizeof(struct sigevent));
memset(&ts,0, sizeof(struct itimerspec));
//notify via thread
sev.sigev_notify = SIGEV_THREAD;
sev.sigev_notify_function = SwitchThreadHandler;
sev.sigev_notify_attributes = NULL;
sev.sigev_value.sival_ptr = tid;
ts.it_value.tv_sec =0;
ts.it_value.tv_nsec = 0;
ts.it_interval.tv_sec = 0;
ts.it_interval.tv_nsec = 200000000;
if(-1 == timer_create(CLOCK_REALTIME,&sev,tid))
{
    retval = EX_SOFTWARE;
    fprintf(stderr,"Failed to create timer.");
    free(tid);
    return retval;
}

if(-1 ==timer_settime(tid,0,&ts,NULL))
{
    int errsv = errno;
    fprintf(stderr,"timer_settime FAILED!!!\n");
    if(errsv == EINVAL)
    {
        fprintf(stderr,"INVALID VALUE!\n");
    }
    else
    {
        fprintf(stderr,"UNKOWN ERROR: %d\n",errsv);
    }
    return EX_SOFTWARE;
}
4

1 に答える 1

4

timer_settimeのようなものtimer_tではなく、最初の引数としてをとることとして文書化されています。が無効な場合は失敗します。timer_t *timer_createEINVALtimerid

*tidしたがって、最初の引数として渡す必要があります。

コンパイラがこれについて警告を発しているはずであることに注意してください。

于 2012-10-05T21:51:49.410 に答える