timer_create(3p) - phpMan

TIMER_CREATE(3P)           POSIX Programmer's Manual          TIMER_CREATE(3P)
PROLOG
       This  manual  page is part of the POSIX Programmer's Manual.  The Linux
       implementation of this interface may differ (consult the  corresponding
       Linux  manual page for details of Linux behavior), or the interface may
       not be implemented on Linux.
NAME
       timer_create -- create a per-process timer
SYNOPSIS
       #include <signal.h>
       #include <time.h>
       int timer_create(clockid_t clockid, struct sigevent *restrict evp,
           timer_t *restrict timerid);
DESCRIPTION
       The timer_create() function shall create a per-process timer using  the
       specified clock, clock_id, as the timing base. The timer_create() func-
       tion shall return, in the location referenced by timerid, a timer ID of
       type  timer_t  used to identify the timer in timer requests. This timer
       ID shall be unique within  the  calling  process  until  the  timer  is
       deleted.  The  particular clock, clock_id, is defined in <time.h>.  The
       timer whose ID is returned shall be in a  disarmed  state  upon  return
       from timer_create().
       The  evp  argument,  if  non-NULL, points to a sigevent structure. This
       structure, allocated by the application, defines the asynchronous noti-
       fication  to occur as specified in Section 2.4.1, Signal Generation and
       Delivery when the timer expires. If  the  evp  argument  is  NULL,  the
       effect  is  as if the evp argument pointed to a sigevent structure with
       the sigev_notify member having the value SIGEV_SIGNAL, the  sigev_signo
       having  a  default signal number, and the sigev_value member having the
       value of the timer ID.
       Each implementation shall define a set of clocks that can  be  used  as
       timing  bases for per-process timers. All implementations shall support
       a clock_id of CLOCK_REALTIME.  If the Monotonic Clock  option  is  sup-
       ported, implementations shall support a clock_id of CLOCK_MONOTONIC.
       Per-process  timers  shall not be inherited by a child process across a
       fork() and shall be disarmed and deleted by an exec.
       If _POSIX_CPUTIME is defined, implementations  shall  support  clock_id
       values representing the CPU-time clock of the calling process.
       If  _POSIX_THREAD_CPUTIME  is  defined,  implementations  shall support
       clock_id values representing the CPU-time clock of the calling thread.
       It is implementation-defined whether  a  timer_create()  function  will
       succeed  if  the  value defined by clock_id corresponds to the CPU-time
       clock of a process or thread  different  from  the  process  or  thread
       invoking the function.
       If        evp->sigev_sigev_notify       is       SIGEV_THREAD       and
       sev->sigev_notify_attributes is not NULL, if the attribute  pointed  to
       by sev->sigev_notify_attributes has a thread stack address specified by
       a call to pthread_attr_setstack(), the results are unspecified  if  the
       signal is generated more than once.
RETURN VALUE
       If  the  call succeeds, timer_create() shall return zero and update the
       location referenced by timerid to a timer_t, which can be passed to the
       per-process  timer calls. If an error occurs, the function shall return
       a value of -1 and set errno to indicate the error. The value of timerid
       is undefined if an error occurs.
ERRORS
       The timer_create() function shall fail if:
       EAGAIN The  system  lacks  sufficient signal queuing resources to honor
              the request.
       EAGAIN The calling process has already created all of the timers it  is
              allowed by this implementation.
       EINVAL The specified clock ID is not defined.
       ENOTSUP
              The  implementation  does  not  support  the creation of a timer
              attached to the CPU-time clock that is specified by clock_id and
              associated  with  a process or thread different from the process
              or thread invoking timer_create().
       The following sections are informative.
EXAMPLES
       None.
APPLICATION USAGE
       If  a  timer  is  created  which  has  evp->sigev_sigev_notify  set  to
       SIGEV_THREAD      and      the      attribute     pointed     to     by
       evp->sigev_notify_attributes has a thread stack address specified by  a
       call to pthread_attr_setstack(), the memory dedicated as a thread stack
       cannot be recovered. The reason for this is that the threads created in
       response  to a timer expiration are created detached, or in an unspeci-
       fied way if the thread attribute's detachstate is  PTHREAD_CREATE_JOIN-
       ABLE.  In  neither case is it valid to call pthread_join(), which makes
       it impossible to determine the lifetime of  the  created  thread  which
       thus means the stack memory cannot be reused.
RATIONALE
   Periodic Timer Overrun and Resource Allocation
       The  specified  timer facilities may deliver realtime signals (that is,
       queued signals) on implementations  that  support  this  option.  Since
       realtime  applications cannot afford to lose notifications of asynchro-
       nous events, like timer expirations or asynchronous I/O completions, it
       must  be  possible to ensure that sufficient resources exist to deliver
       the signal when the event occurs. In general, this is not a  difficulty
       because  there  is  a one-to-one correspondence between a request and a
       subsequent signal generation. If the request cannot allocate the signal
       delivery resources, it can fail the call with an [EAGAIN] error.
       Periodic  timers  are  a special case. A single request can generate an
       unspecified number of signals. This is not a problem if the  requesting
       process  can  service  the  signals as fast as they are generated, thus
       making the signal delivery resources available for delivery  of  subse-
       quent  periodic  timer expiration signals. But, in general, this cannot
       be assured--processing of periodic timer signals may ``overrun'';  that
       is,  subsequent  periodic  timer  expirations may occur before the cur-
       rently pending signal has been delivered.
       Also, for signals, according to the POSIX.1-1990  standard,  if  subse-
       quent  occurrences of a pending signal are generated, it is implementa-
       tion-defined whether a signal is delivered for each occurrence. This is
       not adequate for some realtime applications. So a mechanism is required
       to allow applications to detect how many timer expirations were delayed
       without requiring an indefinite amount of system resources to store the
       delayed expirations.
       The specified facilities provide for  an  overrun  count.  The  overrun
       count is defined as the number of extra timer expirations that occurred
       between the time a timer expiration signal is generated  and  the  time
       the  signal  is  delivered. The signal-catching function, if it is con-
       cerned with overruns, can retrieve  this  count  on  entry.  With  this
       method,  a  periodic  timer  only needs one ``signal queuing resource''
       that can be allocated at the time of the timer_create() function call.
       A function is defined to retrieve the overrun count so that an applica-
       tion  need  not  allocate  static  storage to contain the count, and an
       implementation need not update this  storage  asynchronously  on  timer
       expirations.  But,  for  some high-frequency periodic applications, the
       overhead of an additional system call on each timer expiration  may  be
       prohibitive.  The  functions,  as  defined, permit an implementation to
       maintain the overrun count in user space, associated with the  timerid.
       The timer_getoverrun() function can then be implemented as a macro that
       uses the timerid argument (which may just be a pointer to a user  space
       structure  containing  the counter) to locate the overrun count with no
       system call overhead. Other implementations, less concerned  with  this
       class  of applications, can avoid the asynchronous update of user space
       by maintaining the count in a system structure at the cost of the extra
       system call to obtain it.
   Timer Expiration Signal Parameters
       The  Realtime Signals Extension option supports an application-specific
       datum that is delivered to the extended signal handler. This  value  is
       explicitly  specified  by the application, along with the signal number
       to be delivered, in a sigevent structure. The type of the  application-
       defined  value  can  be  either  an integer constant or a pointer. This
       explicit specification of the value, as opposed to always  sending  the
       timer ID, was selected based on existing practice.
       It  is  common practice for realtime applications (on non-POSIX systems
       or realtime extended POSIX systems) to use the parameters of event han-
       dlers  as  the  case  label of a switch statement or as a pointer to an
       application-defined data structure.  Since  timer_ids  are  dynamically
       allocated  by the timer_create() function, they can be used for neither
       of these functions without additional application overhead in the  sig-
       nal  handler; for example, to search an array of saved timer IDs to as-
       sociate the ID with a constant or application data structure.
FUTURE DIRECTIONS
       None.
SEE ALSO
       clock_getres(), timer_delete(), timer_getoverrun()
       The Base Definitions volume of POSIX.1-2008, <signal.h>, <time.h>
COPYRIGHT
       Portions of this text are reprinted and reproduced in  electronic  form
       from IEEE Std 1003.1, 2013 Edition, Standard for Information Technology
       -- Portable Operating System Interface (POSIX),  The  Open  Group  Base
       Specifications Issue 7, Copyright (C) 2013 by the Institute of Electri-
       cal and Electronics Engineers,  Inc  and  The  Open  Group.   (This  is
       POSIX.1-2008  with  the  2013  Technical Corrigendum 1 applied.) In the
       event of any discrepancy between this version and the original IEEE and
       The  Open Group Standard, the original IEEE and The Open Group Standard
       is the referee document. The original Standard can be  obtained  online
       at http://www.unix.org/online.html .
       Any  typographical  or  formatting  errors that appear in this page are
       most likely to have been introduced during the conversion of the source
       files  to  man page format. To report such errors, see https://www.ker-
       nel.org/doc/man-pages/reporting_bugs.html .
IEEE/The Open Group                  2013                     TIMER_CREATE(3P)