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

timer_create()

Create a timer

Synopsis:

#include <signal.h>
#include <time.h>

int timer_create( clockid_t clock_id,
                  struct sigevent * evp,
                  timer_t * timerid );

Library:

libc

Description:

The timer_create() function creates a per-process timer using the specified clock source, clock_id, as the timing base.

The supported clock_id values are:

CLOCK_REALTIME
The standard POSIX-defined timer.
CLOCK_SOFTTIME
Currently, the same as CLOCK_REALTIME.

The time ID returned in timerid is used in subsequent calls to timer_gettime(), timer_settime() and timer_delete().

The timer is created in the disabled state, and isn't enabled until timer_settime() is called.

If evp isn't NULL, it points to a sigevent structure containing the event to deliver when the timer fires.

We recommend the following event types in this case:

Returns:

0
Success. The timerid argument is set to the timer's ID.
-1
An error occurred (errno is set).

Errors:

EAGAIN
All timers are in use. You'll have to wait for a process to release one.
EINVAL
The clock_id isn't one of the valid CLOCK_* constants.

Examples:

/*
 * Demonstrate how to set up a timer that, on expiry, 
 * sends us a pulse.  This example sets the first 
 * expiry to 1.5 seconds and the repetition interval 
 * to 1.5 seconds.
 */

#include <stdio.h>
#include <time.h>
#include <sys/netmgr.h>
#include <sys/neutrino.h>

#define MY_PULSE_CODE   _PULSE_CODE_MINAVAIL

typedef union {
        struct _pulse   pulse;
        /* your other message structures would go 
           here too */
} my_message_t;

main()
{
   struct sigevent         event;
   struct itimerspec       itime;
   timer_t                 timer_id;
   int                     chid;
   int                     rcvid;
   my_message_t            msg;

   chid = ChannelCreate(0);

   event.sigev_notify = SIGEV_PULSE;
   event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0, 
                                    chid, 
                                    _NTO_SIDE_CHANNEL, 0);
   event.sigev_priority = getprio(0);
   event.sigev_code = MY_PULSE_CODE;
   timer_create(CLOCK_REALTIME, &event, &timer_id);

   itime.it_value.tv_sec = 1;
   /* 500 million nsecs = .5 secs */
   itime.it_value.tv_nsec = 500000000; 
   itime.it_interval.tv_sec = 1;
   /* 500 million nsecs = .5 secs */
   itime.it_interval.tv_nsec = 500000000; 
   timer_settime(timer_id, 0, &itime, NULL);

   /*
    * As of the timer_settime(), we will receive our pulse 
    * in 1.5 seconds (the itime.it_value) and every 1.5 
    * seconds thereafter (the itime.it_interval)
    */

   for (;;) {
       rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);
       if (rcvid == 0) { /* we got a pulse */
            if (msg.pulse.code == MY_PULSE_CODE) {
                printf("we got a pulse from our timer\n");
            } /* else other pulses ... */
       } /* else other messages ... */
   }
}

Classification:

POSIX 1003.1 (Realtime Extensions)

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

Caveats:

The QNX 6 version of timer_create() is different from the QNX 4 version, which was based on a draft standard.

See also:

clock_getres(), clock_gettime(), clock_settime(), errno, nanosleep(), sigevent, sleep(), TimerCreate(), timer_delete(), timer_gettime(), timer_settime()


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