652 lines
19 KiB
HTML
652 lines
19 KiB
HTML
|
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
<HTML><HEAD><TITLE>Man page of TIMER_CREATE</TITLE>
|
|
</HEAD><BODY>
|
|
<H1>TIMER_CREATE</H1>
|
|
Section: Linux Programmer's Manual (2)<BR>Updated: 2019-03-06<BR><A HREF="#index">Index</A>
|
|
<A HREF="/cgi-bin/man/man2html">Return to Main Contents</A><HR>
|
|
|
|
<A NAME="lbAB"> </A>
|
|
<H2>NAME</H2>
|
|
|
|
timer_create - create a POSIX per-process timer
|
|
<A NAME="lbAC"> </A>
|
|
<H2>SYNOPSIS</H2>
|
|
|
|
<PRE>
|
|
<B>#include <<A HREF="file:///usr/include/signal.h">signal.h</A>></B>
|
|
<B>#include <<A HREF="file:///usr/include/time.h">time.h</A>></B>
|
|
|
|
<B>int timer_create(clockid_t </B><I>clockid</I><B>, struct sigevent *</B><I>sevp</I><B>,</B>
|
|
<B> timer_t *</B><I>timerid</I><B>);</B>
|
|
</PRE>
|
|
|
|
<P>
|
|
|
|
Link with <I>-lrt</I>.
|
|
<P>
|
|
|
|
|
|
Feature Test Macro Requirements for glibc (see
|
|
<B><A HREF="/cgi-bin/man/man2html?7+feature_test_macros">feature_test_macros</A></B>(7)):
|
|
|
|
|
|
<P>
|
|
|
|
<B>timer_create</B>():
|
|
|
|
_POSIX_C_SOURCE >= 199309L
|
|
<A NAME="lbAD"> </A>
|
|
<H2>DESCRIPTION</H2>
|
|
|
|
<B>timer_create</B>()
|
|
|
|
creates a new per-process interval timer.
|
|
The ID of the new timer is returned in the buffer pointed to by
|
|
<I>timerid</I>,
|
|
|
|
which must be a non-null pointer.
|
|
This ID is unique within the process, until the timer is deleted.
|
|
The new timer is initially disarmed.
|
|
<P>
|
|
|
|
The
|
|
<I>clockid</I>
|
|
|
|
argument specifies the clock that the new timer uses to measure time.
|
|
It can be specified as one of the following values:
|
|
<DL COMPACT>
|
|
<DT id="1"><B>CLOCK_REALTIME</B>
|
|
|
|
<DD>
|
|
A settable system-wide real-time clock.
|
|
<DT id="2"><B>CLOCK_MONOTONIC</B>
|
|
|
|
<DD>
|
|
A nonsettable monotonically increasing clock that measures time
|
|
from some unspecified point in the past that does not change
|
|
after system startup.
|
|
|
|
|
|
<DT id="3"><B>CLOCK_PROCESS_CPUTIME_ID</B> (since Linux 2.6.12)
|
|
|
|
<DD>
|
|
A clock that measures (user and system) CPU time consumed by
|
|
(all of the threads in) the calling process.
|
|
<DT id="4"><B>CLOCK_THREAD_CPUTIME_ID</B> (since Linux 2.6.12)
|
|
|
|
<DD>
|
|
A clock that measures (user and system) CPU time consumed by
|
|
the calling thread.
|
|
|
|
|
|
<DT id="5"><B>CLOCK_BOOTTIME</B> (Since Linux 2.6.39)
|
|
|
|
<DD>
|
|
|
|
Like
|
|
<B>CLOCK_MONOTONIC</B>,
|
|
|
|
this is a monotonically increasing clock.
|
|
However, whereas the
|
|
<B>CLOCK_MONOTONIC</B>
|
|
|
|
clock does not measure the time while a system is suspended, the
|
|
<B>CLOCK_BOOTTIME</B>
|
|
|
|
clock does include the time during which the system is suspended.
|
|
This is useful for applications that need to be suspend-aware.
|
|
<B>CLOCK_REALTIME</B>
|
|
|
|
is not suitable for such applications, since that clock is affected
|
|
by discontinuous changes to the system clock.
|
|
<DT id="6"><B>CLOCK_REALTIME_ALARM</B> (since Linux 3.0)
|
|
|
|
<DD>
|
|
|
|
This clock is like
|
|
<B>CLOCK_REALTIME</B>,
|
|
|
|
but will wake the system if it is suspended.
|
|
The caller must have the
|
|
<B>CAP_WAKE_ALARM</B>
|
|
|
|
capability in order to set a timer against this clock.
|
|
<DT id="7"><B>CLOCK_BOOTTIME_ALARM</B> (since Linux 3.0)
|
|
|
|
<DD>
|
|
|
|
This clock is like
|
|
<B>CLOCK_BOOTTIME</B>,
|
|
|
|
but will wake the system if it is suspended.
|
|
The caller must have the
|
|
<B>CAP_WAKE_ALARM</B>
|
|
|
|
capability in order to set a timer against this clock.
|
|
</DL>
|
|
<P>
|
|
|
|
As well as the above values,
|
|
<I>clockid</I>
|
|
|
|
can be specified as the
|
|
<I>clockid</I>
|
|
|
|
returned by a call to
|
|
<B><A HREF="/cgi-bin/man/man2html?3+clock_getcpuclockid">clock_getcpuclockid</A></B>(3)
|
|
|
|
or
|
|
<B><A HREF="/cgi-bin/man/man2html?3+pthread_getcpuclockid">pthread_getcpuclockid</A></B>(3).
|
|
|
|
<P>
|
|
|
|
The
|
|
<I>sevp</I>
|
|
|
|
argument points to a
|
|
<I>sigevent</I>
|
|
|
|
structure that specifies how the caller
|
|
should be notified when the timer expires.
|
|
For the definition and general details of this structure, see
|
|
<B><A HREF="/cgi-bin/man/man2html?7+sigevent">sigevent</A></B>(7).
|
|
|
|
<P>
|
|
|
|
The
|
|
<I>sevp.sigev_notify</I>
|
|
|
|
field can have the following values:
|
|
<DL COMPACT>
|
|
<DT id="8"><B>SIGEV_NONE</B>
|
|
|
|
<DD>
|
|
Don't asynchronously notify when the timer expires.
|
|
Progress of the timer can be monitored using
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_gettime">timer_gettime</A></B>(2).
|
|
|
|
<DT id="9"><B>SIGEV_SIGNAL</B>
|
|
|
|
<DD>
|
|
Upon timer expiration, generate the signal
|
|
<I>sigev_signo</I>
|
|
|
|
for the process.
|
|
See
|
|
<B><A HREF="/cgi-bin/man/man2html?7+sigevent">sigevent</A></B>(7)
|
|
|
|
for general details.
|
|
The
|
|
<I>si_code</I>
|
|
|
|
field of the
|
|
<I>siginfo_t</I>
|
|
|
|
structure will be set to
|
|
<B>SI_TIMER</B>.
|
|
|
|
At any point in time,
|
|
at most one signal is queued to the process for a given timer; see
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_getoverrun">timer_getoverrun</A></B>(2)
|
|
|
|
for more details.
|
|
<DT id="10"><B>SIGEV_THREAD</B>
|
|
|
|
<DD>
|
|
Upon timer expiration, invoke
|
|
<I>sigev_notify_function</I>
|
|
|
|
as if it were the start function of a new thread.
|
|
See
|
|
<B><A HREF="/cgi-bin/man/man2html?7+sigevent">sigevent</A></B>(7)
|
|
|
|
for details.
|
|
<DT id="11"><B>SIGEV_THREAD_ID</B> (Linux-specific)
|
|
|
|
<DD>
|
|
As for
|
|
<B>SIGEV_SIGNAL</B>,
|
|
|
|
but the signal is targeted at the thread whose ID is given in
|
|
<I>sigev_notify_thread_id</I>,
|
|
|
|
which must be a thread in the same process as the caller.
|
|
The
|
|
<I>sigev_notify_thread_id</I>
|
|
|
|
field specifies a kernel thread ID, that is, the value returned by
|
|
<B><A HREF="/cgi-bin/man/man2html?2+clone">clone</A></B>(2)
|
|
|
|
or
|
|
<B><A HREF="/cgi-bin/man/man2html?2+gettid">gettid</A></B>(2).
|
|
|
|
This flag is intended only for use by threading libraries.
|
|
</DL>
|
|
<P>
|
|
|
|
Specifying
|
|
<I>sevp</I>
|
|
|
|
as NULL is equivalent to specifying a pointer to a
|
|
<I>sigevent</I>
|
|
|
|
structure in which
|
|
<I>sigev_notify</I>
|
|
|
|
is
|
|
<B>SIGEV_SIGNAL</B>,
|
|
|
|
<I>sigev_signo</I>
|
|
|
|
is
|
|
<B>SIGALRM</B>,
|
|
|
|
and
|
|
<I>sigev_value.sival_int</I>
|
|
|
|
is the timer ID.
|
|
<A NAME="lbAE"> </A>
|
|
<H2>RETURN VALUE</H2>
|
|
|
|
On success,
|
|
<B>timer_create</B>()
|
|
|
|
returns 0, and the ID of the new timer is placed in
|
|
<I>*timerid</I>.
|
|
|
|
On failure, -1 is returned, and
|
|
<I>errno</I>
|
|
|
|
is set to indicate the error.
|
|
<A NAME="lbAF"> </A>
|
|
<H2>ERRORS</H2>
|
|
|
|
<DL COMPACT>
|
|
<DT id="12"><B>EAGAIN</B>
|
|
|
|
<DD>
|
|
Temporary error during kernel allocation of timer structures.
|
|
<DT id="13"><B>EINVAL</B>
|
|
|
|
<DD>
|
|
Clock ID,
|
|
<I>sigev_notify</I>,
|
|
|
|
<I>sigev_signo</I>,
|
|
|
|
or
|
|
<I>sigev_notify_thread_id</I>
|
|
|
|
is invalid.
|
|
<DT id="14"><B>ENOMEM</B>
|
|
|
|
<DD>
|
|
|
|
Could not allocate memory.
|
|
</DL>
|
|
<A NAME="lbAG"> </A>
|
|
<H2>VERSIONS</H2>
|
|
|
|
This system call is available since Linux 2.6.
|
|
<A NAME="lbAH"> </A>
|
|
<H2>CONFORMING TO</H2>
|
|
|
|
POSIX.1-2001, POSIX.1-2008.
|
|
<A NAME="lbAI"> </A>
|
|
<H2>NOTES</H2>
|
|
|
|
A program may create multiple interval timers using
|
|
<B>timer_create</B>().
|
|
|
|
<P>
|
|
|
|
Timers are not inherited by the child of a
|
|
<B><A HREF="/cgi-bin/man/man2html?2+fork">fork</A></B>(2),
|
|
|
|
and are disarmed and deleted during an
|
|
<B><A HREF="/cgi-bin/man/man2html?2+execve">execve</A></B>(2).
|
|
|
|
<P>
|
|
|
|
The kernel preallocates a "queued real-time signal"
|
|
for each timer created using
|
|
<B>timer_create</B>().
|
|
|
|
Consequently, the number of timers is limited by the
|
|
<B>RLIMIT_SIGPENDING</B>
|
|
|
|
resource limit (see
|
|
<B><A HREF="/cgi-bin/man/man2html?2+setrlimit">setrlimit</A></B>(2)).
|
|
|
|
<P>
|
|
|
|
The timers created by
|
|
<B>timer_create</B>()
|
|
|
|
are commonly known as "POSIX (interval) timers".
|
|
The POSIX timers API consists of the following interfaces:
|
|
<DL COMPACT>
|
|
<DT id="15">*<DD>
|
|
<B>timer_create</B>():
|
|
|
|
Create a timer.
|
|
<DT id="16">*<DD>
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_settime">timer_settime</A></B>(2):
|
|
|
|
Arm (start) or disarm (stop) a timer.
|
|
<DT id="17">*<DD>
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_gettime">timer_gettime</A></B>(2):
|
|
|
|
Fetch the time remaining until the next expiration of a timer,
|
|
along with the interval setting of the timer.
|
|
<DT id="18">*<DD>
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_getoverrun">timer_getoverrun</A></B>(2):
|
|
|
|
Return the overrun count for the last timer expiration.
|
|
<DT id="19">*<DD>
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_delete">timer_delete</A></B>(2):
|
|
|
|
Disarm and delete a timer.
|
|
</DL>
|
|
<P>
|
|
|
|
Since Linux 3.10, the
|
|
<I>/proc/[pid]/timers</I>
|
|
|
|
file can be used to list the POSIX timers for the process with PID
|
|
<I>pid</I>.
|
|
|
|
See
|
|
<B><A HREF="/cgi-bin/man/man2html?5+proc">proc</A></B>(5)
|
|
|
|
for further information.
|
|
<P>
|
|
|
|
Since Linux 4.10,
|
|
|
|
support for POSIX timers is a configurable option that is enabled by default.
|
|
Kernel support can be disabled via the
|
|
<B>CONFIG_POSIX_TIMERS</B>
|
|
|
|
option.
|
|
|
|
<A NAME="lbAJ"> </A>
|
|
<H3>C library/kernel differences</H3>
|
|
|
|
Part of the implementation of the POSIX timers API is provided by glibc.
|
|
|
|
In particular:
|
|
<DL COMPACT>
|
|
<DT id="20">*<DD>
|
|
Much of the functionality for
|
|
<B>SIGEV_THREAD</B>
|
|
|
|
is implemented within glibc, rather than the kernel.
|
|
(This is necessarily so,
|
|
since the thread involved in handling the notification is one
|
|
that must be managed by the C library POSIX threads implementation.)
|
|
Although the notification delivered to the process is via a thread,
|
|
internally the NPTL implementation uses a
|
|
<I>sigev_notify</I>
|
|
|
|
value of
|
|
<B>SIGEV_THREAD_ID</B>
|
|
|
|
along with a real-time signal that is reserved by the implementation (see
|
|
<B><A HREF="/cgi-bin/man/man2html?7+nptl">nptl</A></B>(7)).
|
|
|
|
<DT id="21">*<DD>
|
|
The implementation of the default case where
|
|
<I>evp</I>
|
|
|
|
is NULL is handled inside glibc,
|
|
which invokes the underlying system call with a suitably populated
|
|
<I>sigevent</I>
|
|
|
|
structure.
|
|
<DT id="22">*<DD>
|
|
The timer IDs presented at user level are maintained by glibc,
|
|
which maps these IDs to the timer IDs employed by the kernel.
|
|
|
|
|
|
|
|
</DL>
|
|
<P>
|
|
|
|
The POSIX timers system calls first appeared in Linux 2.6.
|
|
Prior to this,
|
|
glibc provided an incomplete user-space implementation
|
|
(<B>CLOCK_REALTIME</B>
|
|
|
|
timers only) using POSIX threads,
|
|
and in glibc versions before 2.17,
|
|
|
|
the implementation falls back to this technique on systems
|
|
running pre-2.6 Linux kernels.
|
|
<A NAME="lbAK"> </A>
|
|
<H2>EXAMPLE</H2>
|
|
|
|
The program below takes two arguments: a sleep period in seconds,
|
|
and a timer frequency in nanoseconds.
|
|
The program establishes a handler for the signal it uses for the timer,
|
|
blocks that signal,
|
|
creates and arms a timer that expires with the given frequency,
|
|
sleeps for the specified number of seconds,
|
|
and then unblocks the timer signal.
|
|
Assuming that the timer expired at least once while the program slept,
|
|
the signal handler will be invoked,
|
|
and the handler displays some information about the timer notification.
|
|
The program terminates after one invocation of the signal handler.
|
|
<P>
|
|
|
|
In the following example run, the program sleeps for 1 second,
|
|
after creating a timer that has a frequency of 100 nanoseconds.
|
|
By the time the signal is unblocked and delivered,
|
|
there have been around ten million overruns.
|
|
<P>
|
|
|
|
|
|
|
|
$ <B>./a.out 1 100</B>
|
|
Establishing handler for signal 34
|
|
Blocking signal 34
|
|
timer ID is 0x804c008
|
|
Sleeping for 1 seconds
|
|
Unblocking signal 34
|
|
Caught signal 34
|
|
<BR> sival_ptr = 0xbfb174f4; *sival_ptr = 0x804c008
|
|
<BR> overrun count = 10004886
|
|
|
|
|
|
<A NAME="lbAL"> </A>
|
|
<H3>Program source</H3>
|
|
|
|
|
|
|
|
#include <<A HREF="file:///usr/include/stdlib.h">stdlib.h</A>>
|
|
#include <<A HREF="file:///usr/include/unistd.h">unistd.h</A>>
|
|
#include <<A HREF="file:///usr/include/stdio.h">stdio.h</A>>
|
|
#include <<A HREF="file:///usr/include/signal.h">signal.h</A>>
|
|
#include <<A HREF="file:///usr/include/time.h">time.h</A>>
|
|
<P>
|
|
#define CLOCKID CLOCK_REALTIME
|
|
#define SIG SIGRTMIN
|
|
<P>
|
|
#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
|
|
<BR> } while (0)
|
|
<P>
|
|
static void
|
|
print_siginfo(siginfo_t *si)
|
|
{
|
|
<BR> timer_t *tidp;
|
|
<BR> int or;
|
|
<P>
|
|
<BR> tidp = si->si_value.sival_ptr;
|
|
<P>
|
|
<BR> printf(" sival_ptr = %p; ", si->si_value.sival_ptr);
|
|
<BR> printf(" *sival_ptr = 0x%lx\n", (long) *tidp);
|
|
<P>
|
|
<BR> or = timer_getoverrun(*tidp);
|
|
<BR> if (or == -1)
|
|
<BR> errExit("timer_getoverrun");
|
|
<BR> else
|
|
<BR> printf(" overrun count = %d\n", or);
|
|
}
|
|
<P>
|
|
static void
|
|
handler(int sig, siginfo_t *si, void *uc)
|
|
{
|
|
<BR> /* Note: calling printf() from a signal handler is not safe
|
|
<BR> (and should not be done in production programs), since
|
|
<BR> printf() is not async-signal-safe; see <A HREF="/cgi-bin/man/man2html?7+signal-safety">signal-safety</A>(7).
|
|
<BR> Nevertheless, we use printf() here as a simple way of
|
|
<BR> showing that the handler was called. */
|
|
<P>
|
|
<BR> printf("Caught signal %d\n", sig);
|
|
<BR> print_siginfo(si);
|
|
<BR> signal(sig, SIG_IGN);
|
|
}
|
|
<P>
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
<BR> timer_t timerid;
|
|
<BR> struct sigevent sev;
|
|
<BR> struct itimerspec its;
|
|
<BR> long long freq_nanosecs;
|
|
<BR> sigset_t mask;
|
|
<BR> struct sigaction sa;
|
|
<P>
|
|
<BR> if (argc != 3) {
|
|
<BR> fprintf(stderr, "Usage: %s <sleep-secs> <freq-nanosecs>\n",
|
|
<BR> argv[0]);
|
|
<BR> exit(EXIT_FAILURE);
|
|
<BR> }
|
|
<P>
|
|
<BR> /* Establish handler for timer signal */
|
|
<P>
|
|
<BR> printf("Establishing handler for signal %d\n", SIG);
|
|
<BR> sa.sa_flags = SA_SIGINFO;
|
|
<BR> sa.sa_sigaction = handler;
|
|
<BR> sigemptyset(&sa.sa_mask);
|
|
<BR> if (sigaction(SIG, &sa, NULL) == -1)
|
|
<BR> errExit("sigaction");
|
|
<P>
|
|
<BR> /* Block timer signal temporarily */
|
|
<P>
|
|
<BR> printf("Blocking signal %d\n", SIG);
|
|
<BR> sigemptyset(&mask);
|
|
<BR> sigaddset(&mask, SIG);
|
|
<BR> if (sigprocmask(SIG_SETMASK, &mask, NULL) == -1)
|
|
<BR> errExit("sigprocmask");
|
|
<P>
|
|
<BR> /* Create the timer */
|
|
<P>
|
|
<BR> sev.sigev_notify = SIGEV_SIGNAL;
|
|
<BR> sev.sigev_signo = SIG;
|
|
<BR> sev.sigev_value.sival_ptr = &timerid;
|
|
<BR> if (timer_create(CLOCKID, &sev, &timerid) == -1)
|
|
<BR> errExit("timer_create");
|
|
<P>
|
|
<BR> printf("timer ID is 0x%lx\n", (long) timerid);
|
|
<P>
|
|
<BR> /* Start the timer */
|
|
<P>
|
|
<BR> freq_nanosecs = atoll(argv[2]);
|
|
<BR> its.it_value.tv_sec = freq_nanosecs / 1000000000;
|
|
<BR> its.it_value.tv_nsec = freq_nanosecs % 1000000000;
|
|
<BR> its.it_interval.tv_sec = its.it_value.tv_sec;
|
|
<BR> its.it_interval.tv_nsec = its.it_value.tv_nsec;
|
|
<P>
|
|
<BR> if (timer_settime(timerid, 0, &its, NULL) == -1)
|
|
<BR> errExit("timer_settime");
|
|
<P>
|
|
<BR> /* Sleep for a while; meanwhile, the timer may expire
|
|
<BR> multiple times */
|
|
<P>
|
|
<BR> printf("Sleeping for %d seconds\n", atoi(argv[1]));
|
|
<BR> sleep(atoi(argv[1]));
|
|
<P>
|
|
<BR> /* Unlock the timer signal, so that timer notification
|
|
<BR> can be delivered */
|
|
<P>
|
|
<BR> printf("Unblocking signal %d\n", SIG);
|
|
<BR> if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == -1)
|
|
<BR> errExit("sigprocmask");
|
|
<P>
|
|
<BR> exit(EXIT_SUCCESS);
|
|
}
|
|
|
|
<A NAME="lbAM"> </A>
|
|
<H2>SEE ALSO</H2>
|
|
|
|
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+clock_gettime">clock_gettime</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+setitimer">setitimer</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_delete">timer_delete</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_getoverrun">timer_getoverrun</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timer_settime">timer_settime</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?2+timerfd_create">timerfd_create</A></B>(2),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+clock_getcpuclockid">clock_getcpuclockid</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?3+pthread_getcpuclockid">pthread_getcpuclockid</A></B>(3),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?7+pthreads">pthreads</A></B>(7),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?7+sigevent">sigevent</A></B>(7),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?7+signal">signal</A></B>(7),
|
|
|
|
<B><A HREF="/cgi-bin/man/man2html?7+time">time</A></B>(7)
|
|
|
|
<A NAME="lbAN"> </A>
|
|
<H2>COLOPHON</H2>
|
|
|
|
This page is part of release 5.05 of the Linux
|
|
<I>man-pages</I>
|
|
|
|
project.
|
|
A description of the project,
|
|
information about reporting bugs,
|
|
and the latest version of this page,
|
|
can be found at
|
|
<A HREF="https://www.kernel.org/doc/man-pages/.">https://www.kernel.org/doc/man-pages/.</A>
|
|
<P>
|
|
|
|
<HR>
|
|
<A NAME="index"> </A><H2>Index</H2>
|
|
<DL>
|
|
<DT id="23"><A HREF="#lbAB">NAME</A><DD>
|
|
<DT id="24"><A HREF="#lbAC">SYNOPSIS</A><DD>
|
|
<DT id="25"><A HREF="#lbAD">DESCRIPTION</A><DD>
|
|
<DT id="26"><A HREF="#lbAE">RETURN VALUE</A><DD>
|
|
<DT id="27"><A HREF="#lbAF">ERRORS</A><DD>
|
|
<DT id="28"><A HREF="#lbAG">VERSIONS</A><DD>
|
|
<DT id="29"><A HREF="#lbAH">CONFORMING TO</A><DD>
|
|
<DT id="30"><A HREF="#lbAI">NOTES</A><DD>
|
|
<DL>
|
|
<DT id="31"><A HREF="#lbAJ">C library/kernel differences</A><DD>
|
|
</DL>
|
|
<DT id="32"><A HREF="#lbAK">EXAMPLE</A><DD>
|
|
<DL>
|
|
<DT id="33"><A HREF="#lbAL">Program source</A><DD>
|
|
</DL>
|
|
<DT id="34"><A HREF="#lbAM">SEE ALSO</A><DD>
|
|
<DT id="35"><A HREF="#lbAN">COLOPHON</A><DD>
|
|
</DL>
|
|
<HR>
|
|
This document was created by
|
|
<A HREF="/cgi-bin/man/man2html">man2html</A>,
|
|
using the manual pages.<BR>
|
|
Time: 00:05:35 GMT, March 31, 2021
|
|
</BODY>
|
|
</HTML>
|