Подробности

[В начало]

Проблема в реализации № S0558

Краткое описание

Вызов timer_create() с clock_id, полученном при помощи clock_getcpuclockid(), приводит к ошибке EINVAL

Подробное описание

Функция timer_create() должна создать таймер процесса, использую часы, специфицированные параметром clock_id. Но вызов timer_create() с clock_id, полученном при помощи clock_getcpuclockid(), приводит к ошибке EINVAL.

Раздел стандарта

Linux Standard Base Core Specification 3.1, Chapter 13. Base Libraries, 13.17. Interfaces for librt, timer_create() function.

Пример

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
#include <time.h>

int printResAndErrno( int res, const char * funcName, const char * funcArgs ) {
    int savedErrno = errno;
    printf( "%s%s is %d\n", funcName, funcArgs, res );
    printf( "after %s( ... ) errno is %d ( %s )\n", funcName, savedErrno, strerror( savedErrno ) );
    return savedErrno;
}

#define callPrintResAndErrno( func, pars ) printResAndErrno( ( errno = 0, func pars ), #func, #pars )

int main( int argc, char ** argv ) {
    clockid_t clockId;
    timer_t timerId;
    // prepare clockId
    callPrintResAndErrno( clock_getcpuclockid, ( 0, & clockId ) );
    // find error
    if ( callPrintResAndErrno( timer_create, ( clockId, NULL, & timerId ) ) == EINVAL ) {
        // error found
        printf( "error : after timer_create( ... ) errno can not be %d ( %s )\n", EINVAL, strerror( EINVAL ) );
    } else {
        // error not found
        printf( "no error\n" );
    }
    return 0;
}

Компонент

glibc 2.3.6 or earlier

Статус

Исправлена в glibc 2.4

[В начало]