[Previous] [Contents] [Index] [Next]

sem_timedwait()

Lock a semaphore

Synopsis:

#include <semaphore.h>
#include <time.h>

int sem_timedwait( 
        sem_t * sem,
        const struct timespec * abs_timeout );

Arguments:

sem
The semaphore that you want to lock.
abs_timeout
A pointer to a timespec structure that specifies the maximum time to wait to lock the semaphore, expressed as an absolute time.

Library:

libc

Description:

The sem_timedwait() function locks the semaphore referenced by sem as in the sem_wait() function. However, if the semaphore can't be locked without waiting for another process or thread to unlock the semaphore by performing a sem_post() function, the wait is terminated when the specified timeout expires.

The timeout expires when the absolute time specified by abs_timeout passes, as measured by the clock on which timeouts are based (i.e. when the value of that clock equals or exceeds abs_timeout), or if the absolute time specified by abs_timeout has already been passed at the time of the call. If the Timers option is supported, the timeout is based on the CLOCK_REALTIME clock; if the Timers option isn't supported, the timeout is based on the system clock as returned by the time() function.

Returns:

0
The calling process successfully performed the semaphore lock operation on the semaphore designated by sem.
-1
The call was unsuccessful (errno is set). The state of the semaphore is unchanged.

Errors:

EDEADLK
A deadlock condition was detected.
EINTR
A signal interrupted this function.
EINVAL
Invalid semaphore sem or the thread would have blocked, and the abs_timeout parameter specified a nanoseconds field value less than zero or greater than or equal to 1000 million.
ETIMEDOUT
The semaphore couldn't be locked before the specified timeout expired.

Examples:

#include <stdio.h>
#include <semaphore.h>
#include <time.h>

main(){

    struct timespec tm;
    sem_t sem;
    int i=0;

    sem_init( &sem, 0, 0);

    do {
        clock_gettime(CLOCK_REALTIME, &tm);
        tm.tv_sec += 1;
        i++;
        printf("i=%d\n",i);
        if (i==10) {
            sem_post(&sem);
        }

    } while ( sem_timedwait( &sem, &tm ) == -1 );

    printf("Semaphore acquired after %d timeouts\n", i);
    return;
}

Classification:

POSIX 1003.1d (draft)

Safety:
Cancellation point Yes
Interrupt handler No
Signal handler Yes
Thread Yes

See also:

errno, sem_post(), sem_trywait(), sem_wait(), time(), timespec


[Previous] [Contents] [Index] [Next]