@node Date and Time, Resource Usage And Limitation, Arithmetic, Top
@c %MENU% Functions for getting the date and time and formatting them nicely
@chapter Date and Time

This chapter describes functions for manipulating dates and times,
including functions for determining what time it is and conversion
between different time representations.

@menu
* Time Basics::                 Concepts and definitions.
* Elapsed Time::                Data types to represent elapsed times
* Processor And CPU Time::      Time a program has spent executing.
* Calendar Time::               Manipulation of ``real'' dates and times.
* Setting an Alarm::            Sending a signal after a specified time.
* Sleeping::                    Waiting for a period of time.
@end menu


@node Time Basics
@section Time Basics
@cindex time

Discussing time in a technical manual can be difficult because the word
``time'' in English refers to lots of different things.  In this manual,
we use a rigorous terminology to avoid confusion, and the only thing we
use the simple word ``time'' for is to talk about the abstract concept.

A @dfn{calendar time} is a point in the time continuum, for example
November 4, 1990 at 18:02.5 UTC.  Sometimes this is called ``absolute
time''.
@cindex calendar time

We don't speak of a ``date'', because that is inherent in a calendar
time.
@cindex date

An @dfn{interval} is a contiguous part of the time continuum between two
calendar times, for example the hour between 9:00 and 10:00 on July 4,
1980.
@cindex interval

An @dfn{elapsed time} is the length of an interval, for example, 35
minutes.  People sometimes sloppily use the word ``interval'' to refer
to the elapsed time of some interval.
@cindex elapsed time
@cindex time, elapsed

An @dfn{amount of time} is a sum of elapsed times, which need not be of
any specific intervals.  For example, the amount of time it takes to
read a book might be 9 hours, independently of when and in how many
sittings it is read.

A @dfn{period} is the elapsed time of an interval between two events,
especially when they are part of a sequence of regularly repeating
events.
@cindex period of time

@dfn{CPU time} is like calendar time, except that it is based on the
subset of the time continuum when a particular process is actively
using a CPU.  CPU time is, therefore, relative to a process.
@cindex CPU time

@dfn{Processor time} is an amount of time that a CPU is in use.  In
fact, it's a basic system resource, since there's a limit to how much
can exist in any given interval (that limit is the elapsed time of the
interval times the number of CPUs in the processor).  People often call
this CPU time, but we reserve the latter term in this manual for the
definition above.
@cindex processor time

@node Elapsed Time
@section Elapsed Time
@cindex elapsed time

One way to represent an elapsed time is with a simple arithmetic data
type, as with the following function to compute the elapsed time between
two calendar times.  This function is declared in @file{time.h}.

@comment time.h
@comment ISO
@deftypefun double difftime (time_t @var{time1}, time_t @var{time0})
The @code{difftime} function returns the number of seconds of elapsed
time between calendar time @var{time1} and calendar time @var{time0}, as
a value of type @code{double}.  The difference ignores leap seconds
unless leap second support is enabled.

In the GNU system, you can simply subtract @code{time_t} values.  But on
other systems, the @code{time_t} data type might use some other encoding
where subtraction doesn't work directly.
@end deftypefun

The GNU C library provides two data types specifically for representing
an elapsed time.  They are used by various GNU C library functions, and
you can use them for your own purposes too.  They're exactly the same
except that one has a resolution in microseconds, and the other, newer
one, is in nanoseconds.

@comment sys/time.h
@comment BSD
@deftp {Data Type} {struct timeval}
@cindex timeval
The @code{struct timeval} structure represents an elapsed time.  It is
declared in @file{sys/time.h} and has the following members:

@table @code
@item long int tv_sec
This represents the number of whole seconds of elapsed time.

@item long int tv_usec
This is the rest of the elapsed time (a fraction of a second),
represented as the number of microseconds.  It is always less than one
million.

@end table
@end deftp

@comment sys/time.h
@comment POSIX.1
@deftp {Data Type} {struct timespec}
@cindex timespec
The @code{struct timespec} structure represents an elapsed time.  It is
declared in @file{time.h} and has the following members:

@table @code
@item long int tv_sec
This represents the number of whole seconds of elapsed time.

@item long int tv_nsec
This is the rest of the elapsed time (a fraction of a second),
represented as the number of nanoseconds.  It is always less than one
billion.

@end table
@end deftp

It is often necessary to subtract two values of type @w{@code{struct
timeval}} or @w{@code{struct timespec}}.  Here is the best way to do
this.  It works even on some peculiar operating systems where the
@code{tv_sec} member has an unsigned type.

@smallexample
/* @r{Subtract the `struct timeval' values X and Y,}
   @r{storing the result in RESULT.}
   @r{Return 1 if the difference is negative, otherwise 0.}  */

int
timeval_subtract (result, x, y)
     struct timeval *result, *x, *y;
@{
  /* @r{Perform the carry for the later subtraction by updating @var{y}.} */
  if (x->tv_usec < y->tv_usec) @{
    int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
    y->tv_usec -= 1000000 * nsec;
    y->tv_sec += nsec;
  @}
  if (x->tv_usec - y->tv_usec > 1000000) @{
    int nsec = (x->tv_usec - y->tv_usec) / 1000000;
    y->tv_usec += 1000000 * nsec;
    y->tv_sec -= nsec;
  @}

  /* @r{Compute the time remaining to wait.}
     @r{@code{tv_usec} is certainly positive.} */
  result->tv_sec = x->tv_sec - y->tv_sec;
  result->tv_usec = x->tv_usec - y->tv_usec;

  /* @r{Return 1 if result is negative.} */
  return x->tv_sec < y->tv_sec;
@}
@end smallexample

Common functions that use @code{struct timeval} are @code{gettimeofday}
and @code{settimeofday}.


There are no GNU C library functions specifically oriented toward
dealing with elapsed times, but the calendar time, processor time, and
alarm and sleeping functions have a lot to do with them.


@node Processor And CPU Time
@section Processor And CPU Time

If you're trying to optimize your program or measure its efficiency,
it's very useful to know how much processor time it uses.  For that,
calendar time and elapsed times are useless because a process may spend
time waiting for I/O or for other processes to use the CPU.  However,
you can get the information with the functions in this section.

CPU time (@pxref{Time Basics}) is represented by the data type
@code{clock_t}, which is a number of @dfn{clock ticks}.  It gives the
total amount of time a process has actively used a CPU since some
arbitrary event.  On the GNU system, that event is the creation of the
process.  While arbitrary in general, the event is always the same event
for any particular process, so you can always measure how much time on
the CPU a particular computation takes by examining the process' CPU
time before and after the computation.
@cindex CPU time
@cindex clock ticks
@cindex ticks, clock

In the GNU system, @code{clock_t} is equivalent to @code{long int} and
@code{CLOCKS_PER_SEC} is an integer value.  But in other systems, both
@code{clock_t} and the macro @code{CLOCKS_PER_SEC} can be either integer
or floating-point types.  Casting CPU time values to @code{double}, as
in the example above, makes sure that operations such as arithmetic and
printing work properly and consistently no matter what the underlying
representation is.

Note that the clock can wrap around.  On a 32bit system with
@code{CLOCKS_PER_SEC} set to one million this function will return the
same value approximately every 72 minutes.

For additional functions to examine a process' use of processor time,
and to control it, see @ref{Resource Usage And Limitation}.


@menu
* CPU Time::                    The @code{clock} function.
* Processor Time::              The @code{times} function.
@end menu

@node CPU Time
@subsection CPU Time Inquiry

To get a process' CPU time, you can use the @code{clock} function.  This
facility is declared in the header file @file{time.h}.
@pindex time.h

In typical usage, you call the @code{clock} function at the beginning
and end of the interval you want to time, subtract the values, and then
divide by @code{CLOCKS_PER_SEC} (the number of clock ticks per second)
to get processor time, like this:

@smallexample
@group
#include <time.h>

clock_t start, end;
double cpu_time_used;

start = clock();
@dots{} /* @r{Do the work.} */
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
@end group
@end smallexample

Do not use a single CPU time as an amount of time; it doesn't work that
way.  Either do a subtraction as shown above or query processor time
directly.  @xref{Processor Time}.

Different computers and operating systems vary wildly in how they keep
track of CPU time.  It's common for the internal processor clock
to have a resolution somewhere between a hundredth and millionth of a
second.

@comment time.h
@comment ISO
@deftypevr Macro int CLOCKS_PER_SEC
The value of this macro is the number of clock ticks per second measured
by the @code{clock} function.  POSIX requires that this value be one
million independent of the actual resolution.
@end deftypevr

@comment time.h
@comment POSIX.1
@deftypevr Macro int CLK_TCK
This is an obsolete name for @code{CLOCKS_PER_SEC}.
@end deftypevr

@comment time.h
@comment ISO
@deftp {Data Type} clock_t
This is the type of the value returned by the @code{clock} function.
Values of type @code{clock_t} are numbers of clock ticks.
@end deftp

@comment time.h
@comment ISO
@deftypefun clock_t clock (void)
This function returns the calling process' current CPU time.  If the CPU
time is not available or cannot be represented, @code{clock} returns the
value @code{(clock_t)(-1)}.
@end deftypefun


@node Processor Time
@subsection Processor Time Inquiry

The @code{times} function returns information about a process'
consumption of processor time in a @w{@code{struct tms}} object, in
addition to the process' CPU time.  @xref{Time Basics}.  You should
include the header file @file{sys/times.h} to use this facility.
@cindex processor time
@cindex CPU time
@pindex sys/times.h

@comment sys/times.h
@comment POSIX.1
@deftp {Data Type} {struct tms}
The @code{tms} structure is used to return information about process
times.  It contains at least the following members:

@table @code
@item clock_t tms_utime
This is the total processor time the calling process has used in
executing the instructions of its program.

@item clock_t tms_stime
This is the processor time the system has used on behalf of the calling
process.

@item clock_t tms_cutime
This is the sum of the @code{tms_utime} values and the @code{tms_cutime}
values of all terminated child processes of the calling process, whose
status has been reported to the parent process by @code{wait} or
@code{waitpid}; see @ref{Process Completion}.  In other words, it
represents the total processor time used in executing the instructions
of all the terminated child processes of the calling process, excluding
child processes which have not yet been reported by @code{wait} or
@code{waitpid}.
@cindex child process

@item clock_t tms_cstime
This is similar to @code{tms_cutime}, but represents the total processor
time system has used on behalf of all the terminated child processes
of the calling process.
@end table

All of the times are given in numbers of clock ticks.  Unlike CPU time,
these are the actual amounts of time; not relative to any event.
@xref{Creating a Process}.
@end deftp

@comment sys/times.h
@comment POSIX.1
@deftypefun clock_t times (struct tms *@var{buffer})
The @code{times} function stores the processor time information for
the calling process in @var{buffer}.

The return value is the calling process' CPU time (the same value you
get from @code{clock()}.  @code{times} returns @code{(clock_t)(-1)} to
indicate failure.
@end deftypefun

@strong{Portability Note:} The @code{clock} function described in
@ref{CPU Time} is specified by the @w{ISO C} standard.  The
@code{times} function is a feature of POSIX.1.  In the GNU system, the
CPU time is defined to be equivalent to the sum of the @code{tms_utime}
and @code{tms_stime} fields returned by @code{times}.

@node Calendar Time
@section Calendar Time

This section describes facilities for keeping track of calendar time.
@xref{Time Basics}.

The GNU C library represents calendar time three ways:

@itemize @bullet
@item
@dfn{Simple time} (the @code{time_t} data type) is a compact
representation, typically giving the number of seconds of elapsed time
since some implementation-specific base time.
@cindex simple time

@item
There is also a "high-resolution time" representation.  Like simple
time, this represents a calendar time as an elapsed time since a base
time, but instead of measuring in whole seconds, it uses a @code{struct
timeval} data type, which includes fractions of a second.  Use this time
representation instead of simple time when you need greater precision.
@cindex high-resolution time

@item
@dfn{Local time} or @dfn{broken-down time} (the @code{struct tm} data
type) represents a calendar time as a set of components specifying the
year, month, and so on in the Gregorian calendar, for a specific time
zone.  This calendar time representation is usually used only to
communicate with people.
@cindex local time
@cindex broken-down time
@cindex Gregorian calendar
@cindex calendar, Gregorian
@end itemize

@menu
* Simple Calendar Time::        Facilities for manipulating calendar time.
* High-Resolution Calendar::    A time representation with greater precision.
* Broken-down Time::            Facilities for manipulating local time.
* High Accuracy Clock::         Maintaining a high accuracy system clock.
* Formatting Calendar Time::    Converting times to strings.
* Parsing Date and Time::       Convert textual time and date information back
                                 into broken-down time values.
* TZ Variable::                 How users specify the time zone.
* Time Zone Functions::         Functions to examine or specify the time zone.
* Time Functions Example::      An example program showing use of some of
				 the time functions.
@end menu

@node Simple Calendar Time
@subsection Simple Calendar Time

This section describes the @code{time_t} data type for representing calendar
time as simple time, and the functions which operate on simple time objects.
These facilities are declared in the header file @file{time.h}.
@pindex time.h

@cindex epoch
@comment time.h
@comment ISO
@deftp {Data Type} time_t
This is the data type used to represent simple time.  Sometimes, it also
represents an elapsed time.  When interpreted as a calendar time value,
it represents the number of seconds elapsed since 00:00:00 on January 1,
1970, Coordinated Universal Time.  (This calendar time is sometimes
referred to as the @dfn{epoch}.)  POSIX requires that this count not
include leap seconds, but on some systems this count includes leap seconds
if you set @code{TZ} to certain values (@pxref{TZ Variable}).

Note that a simple time has no concept of local time zone.  Calendar
Time @var{T} is the same instant in time regardless of where on the
globe the computer is.

In the GNU C library, @code{time_t} is equivalent to @code{long int}.
In other systems, @code{time_t} might be either an integer or
floating-point type.
@end deftp

The function @code{difftime} tells you the elapsed time between two
simple calendar times, which is not always as easy to compute as just
subtracting.  @xref{Elapsed Time}.

@comment time.h
@comment ISO
@deftypefun time_t time (time_t *@var{result})
The @code{time} function returns the current calendar time as a value of
type @code{time_t}.  If the argument @var{result} is not a null pointer,
the calendar time value is also stored in @code{*@var{result}}.  If the
current calendar time is not available, the value
@w{@code{(time_t)(-1)}} is returned.
@end deftypefun

@c The GNU C library implements stime() with a call to settimeofday() on
@c Linux.
@comment time.h
@comment SVID, XPG
@deftypefun int stime (time_t *@var{newtime})
@code{stime} sets the system clock, i.e., it tells the system that the
current calendar time is @var{newtime}, where @code{newtime} is
interpreted as described in the above definition of @code{time_t}.

@code{settimeofday} is a newer function which sets the system clock to
better than one second precision.  @code{settimeofday} is generally a
better choice than @code{stime}.  @xref{High-Resolution Calendar}.

Only the superuser can set the system clock.

If the function succeeds, the return value is zero.  Otherwise, it is
@code{-1} and @code{errno} is set accordingly:

@table @code
@item EPERM
The process is not superuser.
@end table
@end deftypefun



@node High-Resolution Calendar
@subsection High-Resolution Calendar

The @code{time_t} data type used to represent simple times has a
resolution of only one second.  Some applications need more precision.

So, the GNU C library also contains functions which are capable of
representing calendar times to a higher resolution than one second.  The
functions and the associated data types described in this section are
declared in @file{sys/time.h}.
@pindex sys/time.h

@comment sys/time.h
@comment BSD
@deftp {Data Type} {struct timezone}
The @code{struct timezone} structure is used to hold minimal information
about the local time zone.  It has the following members:

@table @code
@item int tz_minuteswest
This is the number of minutes west of UTC.

@item int tz_dsttime
If nonzero, Daylight Saving Time applies during some part of the year.
@end table

The @code{struct timezone} type is obsolete and should never be used.
Instead, use the facilities described in @ref{Time Zone Functions}.
@end deftp

@comment sys/time.h
@comment BSD
@deftypefun int gettimeofday (struct timeval *@var{tp}, struct timezone *@var{tzp})
The @code{gettimeofday} function returns the current calendar time as
the elapsed time since the epoch in the @code{struct timeval} structure
indicated by @var{tp}.  (@pxref{Elapsed Time} for a description of
@code{struct timeval}).  Information about the time zone is returned in
the structure pointed at @var{tzp}.  If the @var{tzp} argument is a null
pointer, time zone information is ignored.

The return value is @code{0} on success and @code{-1} on failure.  The
following @code{errno} error condition is defined for this function:

@table @code
@item ENOSYS
The operating system does not support getting time zone information, and
@var{tzp} is not a null pointer.  The GNU operating system does not
support using @w{@code{struct timezone}} to represent time zone
information; that is an obsolete feature of 4.3 BSD.
Instead, use the facilities described in @ref{Time Zone Functions}.
@end table
@end deftypefun

@comment sys/time.h
@comment BSD
@deftypefun int settimeofday (const struct timeval *@var{tp}, const struct timezone *@var{tzp})
The @code{settimeofday} function sets the current calendar time in the
system clock according to the arguments.  As for @code{gettimeofday},
the calendar time is represented as the elapsed time since the epoch.
As for @code{gettimeofday}, time zone information is ignored if
@var{tzp} is a null pointer.

You must be a privileged user in order to use @code{settimeofday}.

Some kernels automatically set the system clock from some source such as
a hardware clock when they start up.  Others, including Linux, place the
system clock in an ``invalid'' state (in which attempts to read the clock
fail).  A call of @code{stime} removes the system clock from an invalid
state, and system startup scripts typically run a program that calls
@code{stime}.

@code{settimeofday} causes a sudden jump forwards or backwards, which
can cause a variety of problems in a system.  Use @code{adjtime} (below)
to make a smooth transition from one time to another by temporarily
speeding up or slowing down the clock.

With a Linux kernel, @code{adjtimex} does the same thing and can also
make permanent changes to the speed of the system clock so it doesn't
need to be corrected as often.

The return value is @code{0} on success and @code{-1} on failure.  The
following @code{errno} error conditions are defined for this function:

@table @code
@item EPERM
This process cannot set the clock because it is not privileged.

@item ENOSYS
The operating system does not support setting time zone information, and
@var{tzp} is not a null pointer.
@end table
@end deftypefun

@c On Linux, GNU libc implements adjtime() as a call to adjtimex().
@comment sys/time.h
@comment BSD
@deftypefun int adjtime (const struct timeval *@var{delta}, struct timeval *@var{olddelta})
This function speeds up or slows down the system clock in order to make
a gradual adjustment.  This ensures that the calendar time reported by
the system clock is always monotonically increasing, which might not
happen if you simply set the clock.

The @var{delta} argument specifies a relative adjustment to be made to
the clock time.  If negative, the system clock is slowed down for a
while until it has lost this much elapsed time.  If positive, the system
clock is speeded up for a while.

If the @var{olddelta} argument is not a null pointer, the @code{adjtime}
function returns information about any previous time adjustment that
has not yet completed.

This function is typically used to synchronize the clocks of computers
in a local network.  You must be a privileged user to use it.

With a Linux kernel, you can use the @code{adjtimex} function to
permanently change the clock speed.

The return value is @code{0} on success and @code{-1} on failure.  The
following @code{errno} error condition is defined for this function:

@table @code
@item EPERM
You do not have privilege to set the time.
@end table
@end deftypefun

@strong{Portability Note:}  The @code{gettimeofday}, @code{settimeofday},
and @code{adjtime} functions are derived from BSD.


Symbols for the following function are declared in @file{sys/timex.h}.

@comment sys/timex.h
@comment GNU
@deftypefun int adjtimex (struct timex *@var{timex})

@code{adjtimex} is functionally identical to @code{ntp_adjtime}.
@xref{High Accuracy Clock}.

This function is present only with a Linux kernel.

@end deftypefun

@node Broken-down Time
@subsection Broken-down Time
@cindex broken-down time
@cindex calendar time and broken-down time

Calendar time is represented by the usual GNU C library functions as an
elapsed time since a fixed base calendar time.  This is convenient for
computation, but has no relation to the way people normally think of
calendar time.  By contrast, @dfn{broken-down time} is a binary
representation of calendar time separated into year, month, day, and so
on.  Broken-down time values are not useful for calculations, but they
are useful for printing human readable time information.

A broken-down time value is always relative to a choice of time
zone, and it also indicates which time zone that is.

The symbols in this section are declared in the header file @file{time.h}.

@comment time.h
@comment ISO
@deftp {Data Type} {struct tm}
This is the data type used to represent a broken-down time.  The structure
contains at least the following members, which can appear in any order.

@table @code
@item int tm_sec
This is the number of full seconds since the top of the minute (normally
in the range @code{0} through @code{59}, but the actual upper limit is
@code{60}, to allow for leap seconds if leap second support is
available).
@cindex leap second

@item int tm_min
This is the number of full minutes since the top of the hour (in the
range @code{0} through @code{59}).

@item int tm_hour
This is the number of full hours past midnight (in the range @code{0} through
@code{23}).

@item int tm_mday
This is the ordinal day of the month (in the range @code{1} through @code{31}).
Watch out for this one!  As the only ordinal number in the structure, it is
inconsistent with the rest of the structure.

@item int tm_mon
This is the number of full calendar months since the beginning of the
year (in the range @code{0} through @code{11}).  Watch out for this one!
People usually use ordinal numbers for month-of-year (where January = 1).

@item int tm_year
This is the number of full calendar years since 1900.

@item int tm_wday
This is the number of full days since Sunday (in the range @code{0} through
@code{6}).

@item int tm_yday
This is the number of full days since the beginning of the year (in the
range @code{0} through @code{365}).

@item int tm_isdst
@cindex Daylight Saving Time
@cindex summer time
This is a flag that indicates whether Daylight Saving Time is (or was, or
will be) in effect at the time described.  The value is positive if
Daylight Saving Time is in effect, zero if it is not, and negative if the
information is not available.

@item long int tm_gmtoff
This field describes the time zone that was used to compute this
broken-down time value, including any adjustment for daylight saving; it
is the number of seconds that you must add to UTC to get local time.
You can also think of this as the number of seconds east of UTC.  For
example, for U.S. Eastern Standard Time, the value is @code{-5*60*60}.
The @code{tm_gmtoff} field is derived from BSD and is a GNU library
extension; it is not visible in a strict @w{ISO C} environment.

@item const char *tm_zone
This field is the name for the time zone that was used to compute this
broken-down time value.  Like @code{tm_gmtoff}, this field is a BSD and
GNU extension, and is not visible in a strict @w{ISO C} environment.
@end table
@end deftp


@comment time.h
@comment ISO
@deftypefun {struct tm *} localtime (const time_t *@var{time})
The @code{localtime} function converts the simple time pointed to by
@var{time} to broken-down time representation, expressed relative to the
user's specified time zone.

The return value is a pointer to a static broken-down time structure, which
might be overwritten by subsequent calls to @code{ctime}, @code{gmtime},
or @code{localtime}.  (But no other library function overwrites the contents
of this object.)

The return value is the null pointer if @var{time} cannot be represented
as a broken-down time; typically this is because the year cannot fit into
an @code{int}.

Calling @code{localtime} has one other effect: it sets the variable
@code{tzname} with information about the current time zone.  @xref{Time
Zone Functions}.
@end deftypefun

Using the @code{localtime} function is a big problem in multi-threaded
programs.  The result is returned in a static buffer and this is used in
all threads.  POSIX.1c introduced a variant of this function.

@comment time.h
@comment POSIX.1c
@deftypefun {struct tm *} localtime_r (const time_t *@var{time}, struct tm *@var{resultp})
The @code{localtime_r} function works just like the @code{localtime}
function.  It takes a pointer to a variable containing a simple time
and converts it to the broken-down time format.

But the result is not placed in a static buffer.  Instead it is placed
in the object of type @code{struct tm} to which the parameter
@var{resultp} points.

If the conversion is successful the function returns a pointer to the
object the result was written into, i.e., it returns @var{resultp}.
@end deftypefun


@comment time.h
@comment ISO
@deftypefun {struct tm *} gmtime (const time_t *@var{time})
This function is similar to @code{localtime}, except that the broken-down
time is expressed as Coordinated Universal Time (UTC) (formerly called
Greenwich Mean Time (GMT)) rather than relative to a local time zone.

@end deftypefun

As for the @code{localtime} function we have the problem that the result
is placed in a static variable.  POSIX.1c also provides a replacement for
@code{gmtime}.

@comment time.h
@comment POSIX.1c
@deftypefun {struct tm *} gmtime_r (const time_t *@var{time}, struct tm *@var{resultp})
This function is similar to @code{localtime_r}, except that it converts
just like @code{gmtime} the given time as Coordinated Universal Time.

If the conversion is successful the function returns a pointer to the
object the result was written into, i.e., it returns @var{resultp}.
@end deftypefun


@comment time.h
@comment ISO
@deftypefun time_t mktime (struct tm *@var{brokentime})
The @code{mktime} function is used to convert a broken-down time structure
to a simple time representation.  It also ``normalizes'' the contents of
the broken-down time structure, by filling in the day of week and day of
year based on the other date and time components.

The @code{mktime} function ignores the specified contents of the
@code{tm_wday} and @code{tm_yday} members of the broken-down time
structure.  It uses the values of the other components to determine the
calendar time; it's permissible for these components to have
unnormalized values outside their normal ranges.  The last thing that
@code{mktime} does is adjust the components of the @var{brokentime}
structure (including the @code{tm_wday} and @code{tm_yday}).

If the specified broken-down time cannot be represented as a simple time,
@code{mktime} returns a value of @code{(time_t)(-1)} and does not modify
the contents of @var{brokentime}.

Calling @code{mktime} also sets the variable @code{tzname} with
information about the current time zone.  @xref{Time Zone Functions}.
@end deftypefun

@comment time.h
@comment ???
@deftypefun time_t timelocal (struct tm *@var{brokentime})

@code{timelocal} is functionally identical to @code{mktime}, but more
mnemonically named.  Note that it is the inverse of the @code{localtime}
function.

@strong{Portability note:}  @code{mktime} is essentially universally
available.  @code{timelocal} is rather rare.

@end deftypefun

@comment time.h
@comment ???
@deftypefun time_t timegm (struct tm *@var{brokentime})

@code{timegm} is functionally identical to @code{mktime} except it
always takes the input values to be Coordinated Universal Time (UTC)
regardless of any local time zone setting.

Note that @code{timegm} is the inverse of @code{gmtime}.

@strong{Portability note:}  @code{mktime} is essentially universally
available.  @code{timegm} is rather rare.  For the most portable
conversion from a UTC broken-down time to a simple time, set
the @code{TZ} environment variable to UTC, call @code{mktime}, then set
@code{TZ} back.

@end deftypefun



@node High Accuracy Clock
@subsection High Accuracy Clock

@cindex time, high precision
@cindex clock, high accuracy
@pindex sys/timex.h
@c On Linux, GNU libc implements ntp_gettime() and npt_adjtime() as calls
@c to adjtimex().
The @code{ntp_gettime} and @code{ntp_adjtime} functions provide an
interface to monitor and manipulate the system clock to maintain high
accuracy time.  For example, you can fine tune the speed of the clock
or synchronize it with another time source.

A typical use of these functions is by a server implementing the Network
Time Protocol to synchronize the clocks of multiple systems and high
precision clocks.

These functions are declared in @file{sys/timex.h}.

@tindex struct ntptimeval
@deftp {Data Type} {struct ntptimeval}
This structure is used for information about the system clock.  It
contains the following members:
@table @code
@item struct timeval time
This is the current calendar time, expressed as the elapsed time since
the epoch.  The @code{struct timeval} data type is described in
@ref{Elapsed Time}.

@item long int maxerror
This is the maximum error, measured in microseconds.  Unless updated
via @code{ntp_adjtime} periodically, this value will reach some
platform-specific maximum value.

@item long int esterror
This is the estimated error, measured in microseconds.  This value can
be set by @code{ntp_adjtime} to indicate the estimated offset of the
system clock from the true calendar time.
@end table
@end deftp

@comment sys/timex.h
@comment GNU
@deftypefun int ntp_gettime (struct ntptimeval *@var{tptr})
The @code{ntp_gettime} function sets the structure pointed to by
@var{tptr} to current values.  The elements of the structure afterwards
contain the values the timer implementation in the kernel assumes.  They
might or might not be correct.  If they are not a @code{ntp_adjtime}
call is necessary.

The return value is @code{0} on success and other values on failure.  The
following @code{errno} error conditions are defined for this function:

@table @code
@item TIME_ERROR
The precision clock model is not properly set up at the moment, thus the
clock must be considered unsynchronized, and the values should be
treated with care.
@end table
@end deftypefun

@tindex struct timex
@deftp {Data Type} {struct timex}
This structure is used to control and monitor the system clock.  It
contains the following members:
@table @code
@item unsigned int modes
This variable controls whether and which values are set.  Several
symbolic constants have to be combined with @emph{binary or} to specify
the effective mode.  These constants start with @code{MOD_}.

@item long int offset
This value indicates the current offset of the system clock from the true
calendar time.  The value is given in microseconds.  If bit
@code{MOD_OFFSET} is set in @code{modes}, the offset (and possibly other
dependent values) can be set.  The offset's absolute value must not
exceed @code{MAXPHASE}.


@item long int frequency
This value indicates the difference in frequency between the true
calendar time and the system clock.  The value is expressed as scaled
PPM (parts per million, 0.0001%).  The scaling is @code{1 <<
SHIFT_USEC}.  The value can be set with bit @code{MOD_FREQUENCY}, but
the absolute value must not exceed @code{MAXFREQ}.

@item long int maxerror
This is the maximum error, measured in microseconds.  A new value can be
set using bit @code{MOD_MAXERROR}.  Unless updated via
@code{ntp_adjtime} periodically, this value will increase steadily
and reach some platform-specific maximum value.

@item long int esterror
This is the estimated error, measured in microseconds.  This value can
be set using bit @code{MOD_ESTERROR}.

@item int status
This variable reflects the various states of the clock machinery.  There
are symbolic constants for the significant bits, starting with
@code{STA_}.  Some of these flags can be updated using the
@code{MOD_STATUS} bit.

@item long int constant
This value represents the bandwidth or stiffness of the PLL (phase
locked loop) implemented in the kernel.  The value can be changed using
bit @code{MOD_TIMECONST}.

@item long int precision
This value represents the accuracy or the maximum error when reading the
system clock.  The value is expressed in microseconds.

@item long int tolerance
This value represents the maximum frequency error of the system clock in
scaled PPM.  This value is used to increase the @code{maxerror} every
second.

@item struct timeval time
The current calendar time.

@item long int tick
The elapsed time between clock ticks in microseconds.  A clock tick is a
periodic timer interrupt on which the system clock is based.

@item long int ppsfreq
This is the first of a few optional variables that are present only if
the system clock can use a PPS (pulse per second) signal to discipline
the system clock.  The value is expressed in scaled PPM and it denotes
the difference in frequency between the system clock and the PPS signal.

@item long int jitter
This value expresses a median filtered average of the PPS signal's
dispersion in microseconds.

@item int shift
This value is a binary exponent for the duration of the PPS calibration
interval, ranging from @code{PPS_SHIFT} to @code{PPS_SHIFTMAX}.

@item long int stabil
This value represents the median filtered dispersion of the PPS
frequency in scaled PPM.

@item long int jitcnt
This counter represents the number of pulses where the jitter exceeded
the allowed maximum @code{MAXTIME}.

@item long int calcnt
This counter reflects the number of successful calibration intervals.

@item long int errcnt
This counter represents the number of calibration errors (caused by
large offsets or jitter).

@item long int stbcnt
This counter denotes the number of calibrations where the stability
exceeded the threshold.
@end table
@end deftp

@comment sys/timex.h
@comment GNU
@deftypefun int ntp_adjtime (struct timex *@var{tptr})
The @code{ntp_adjtime} function sets the structure specified by
@var{tptr} to current values.

In addition, @code{ntp_adjtime} updates some settings to match what you
pass to it in *@var{tptr}.  Use the @code{modes} element of *@var{tptr}
to select what settings to update.  You can set @code{offset},
@code{freq}, @code{maxerror}, @code{esterror}, @code{status},
@code{constant}, and @code{tick}.

@code{modes} = zero means set nothing.

Only the superuser can update settings.

@c On Linux, ntp_adjtime() also does the adjtime() function if you set
@c modes = ADJ_OFFSET_SINGLESHOT (in fact, that is how GNU libc implements
@c adjtime()).  But this should be considered an internal function because
@c it's so inconsistent with the rest of what ntp_adjtime() does and is
@c forced in an ugly way into the struct timex.  So we don't document it
@c and instead document adjtime() as the way to achieve the function.

The return value is @code{0} on success and other values on failure.  The
following @code{errno} error conditions are defined for this function:

@table @code
@item TIME_ERROR
The high accuracy clock model is not properly set up at the moment, thus the
clock must be considered unsynchronized, and the values should be
treated with care.  Another reason could be that the specified new values
are not allowed.

@item EPERM
The process specified a settings update, but is not superuser.

@end table

For more details see RFC1305 (Network Time Protocol, Version 3) and
related documents.

@strong{Portability note:} Early versions of the GNU C library did not
have this function but did have the synonymous @code{adjtimex}.

@end deftypefun


@node Formatting Calendar Time
@subsection Formatting Calendar Time

The functions described in this section format calendar time values as
strings.  These functions are declared in the header file @file{time.h}.
@pindex time.h

@comment time.h
@comment ISO
@deftypefun {char *} asctime (const struct tm *@var{brokentime})
The @code{asctime} function converts the broken-down time value that
@var{brokentime} points to into a string in a standard format:

@smallexample
"Tue May 21 13:46:22 1991\n"
@end smallexample

The abbreviations for the days of week are: @samp{Sun}, @samp{Mon},
@samp{Tue}, @samp{Wed}, @samp{Thu}, @samp{Fri}, and @samp{Sat}.

The abbreviations for the months are: @samp{Jan}, @samp{Feb},
@samp{Mar}, @samp{Apr}, @samp{May}, @samp{Jun}, @samp{Jul}, @samp{Aug},
@samp{Sep}, @samp{Oct}, @samp{Nov}, and @samp{Dec}.

The return value points to a statically allocated string, which might be
overwritten by subsequent calls to @code{asctime} or @code{ctime}.
(But no other library function overwrites the contents of this
string.)
@end deftypefun

@comment time.h
@comment POSIX.1c
@deftypefun {char *} asctime_r (const struct tm *@var{brokentime}, char *@var{buffer})
This function is similar to @code{asctime} but instead of placing the
result in a static buffer it writes the string in the buffer pointed to
by the parameter @var{buffer}.  This buffer should have room
for at least 26 bytes, including the terminating null.

If no error occurred the function returns a pointer to the string the
result was written into, i.e., it returns @var{buffer}.  Otherwise
return @code{NULL}.
@end deftypefun


@comment time.h
@comment ISO
@deftypefun {char *} ctime (const time_t *@var{time})
The @code{ctime} function is similar to @code{asctime}, except that you
specify the calendar time argument as a @code{time_t} simple time value
rather than in broken-down local time format.  It is equivalent to

@smallexample
asctime (localtime (@var{time}))
@end smallexample

@code{ctime} sets the variable @code{tzname}, because @code{localtime}
does so.  @xref{Time Zone Functions}.
@end deftypefun

@comment time.h
@comment POSIX.1c
@deftypefun {char *} ctime_r (const time_t *@var{time}, char *@var{buffer})
This function is similar to @code{ctime}, but places the result in the
string pointed to by @var{buffer}.  It is equivalent to (written using
gcc extensions, @pxref{Statement Exprs,,,gcc,Porting and Using gcc}):

@smallexample
(@{ struct tm tm; asctime_r (localtime_r (time, &tm), buf); @})
@end smallexample

If no error occurred the function returns a pointer to the string the
result was written into, i.e., it returns @var{buffer}.  Otherwise
return @code{NULL}.
@end deftypefun


@comment time.h
@comment ISO
@deftypefun size_t strftime (char *@var{s}, size_t @var{size}, const char *@var{template}, const struct tm *@var{brokentime})
This function is similar to the @code{sprintf} function (@pxref{Formatted
Input}), but the conversion specifications that can appear in the format
template @var{template} are specialized for printing components of the date
and time @var{brokentime} according to the locale currently specified for
time conversion (@pxref{Locales}).

Ordinary characters appearing in the @var{template} are copied to the
output string @var{s}; this can include multibyte character sequences.
Conversion specifiers are introduced by a @samp{%} character, followed
by an optional flag which can be one of the following.  These flags
are all GNU extensions. The first three affect only the output of
numbers:

@table @code
@item _
The number is padded with spaces.

@item -
The number is not padded at all.

@item 0
The number is padded with zeros even if the format specifies padding
with spaces.

@item ^
The output uses uppercase characters, but only if this is possible
(@pxref{Case Conversion}).
@end table

The default action is to pad the number with zeros to keep it a constant
width.  Numbers that do not have a range indicated below are never
padded, since there is no natural width for them.

Following the flag an optional specification of the width is possible.
This is specified in decimal notation.  If the natural size of the
output is of the field has less than the specified number of characters,
the result is written right adjusted and space padded to the given
size.

An optional modifier can follow the optional flag and width
specification.  The modifiers, which were first standardized by
POSIX.2-1992 and by @w{ISO C99}, are:

@table @code
@item E
Use the locale's alternate representation for date and time.  This
modifier applies to the @code{%c}, @code{%C}, @code{%x}, @code{%X},
@code{%y} and @code{%Y} format specifiers.  In a Japanese locale, for
example, @code{%Ex} might yield a date format based on the Japanese
Emperors' reigns.

@item O
Use the locale's alternate numeric symbols for numbers.  This modifier
applies only to numeric format specifiers.
@end table

If the format supports the modifier but no alternate representation
is available, it is ignored.

The conversion specifier ends with a format specifier taken from the
following list.  The whole @samp{%} sequence is replaced in the output
string as follows:

@table @code
@item %a
The abbreviated weekday name according to the current locale.

@item %A
The full weekday name according to the current locale.

@item %b
The abbreviated month name according to the current locale.

@item %B
The full month name according to the current locale.

Using @code{%B} together with @code{%d} produces grammatically
incorrect results for some locales.

@item %c
The preferred calendar time representation for the current locale.

@item %C
The century of the year.  This is equivalent to the greatest integer not
greater than the year divided by 100.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %d
The day of the month as a decimal number (range @code{01} through @code{31}).

@item %D
The date using the format @code{%m/%d/%y}.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %e
The day of the month like with @code{%d}, but padded with blank (range
@code{ 1} through @code{31}).

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %F
The date using the format @code{%Y-%m-%d}.  This is the form specified
in the @w{ISO 8601} standard and is the preferred form for all uses.

This format was first standardized by @w{ISO C99} and by POSIX.1-2001.

@item %g
The year corresponding to the ISO week number, but without the century
(range @code{00} through @code{99}).  This has the same format and value
as @code{%y}, except that if the ISO week number (see @code{%V}) belongs
to the previous or next year, that year is used instead.

This format was first standardized by @w{ISO C99} and by POSIX.1-2001.

@item %G
The year corresponding to the ISO week number.  This has the same format
and value as @code{%Y}, except that if the ISO week number (see
@code{%V}) belongs to the previous or next year, that year is used
instead.

This format was first standardized by @w{ISO C99} and by POSIX.1-2001
but was previously available as a GNU extension.

@item %h
The abbreviated month name according to the current locale.  The action
is the same as for @code{%b}.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %H
The hour as a decimal number, using a 24-hour clock (range @code{00} through
@code{23}).

@item %I
The hour as a decimal number, using a 12-hour clock (range @code{01} through
@code{12}).

@item %j
The day of the year as a decimal number (range @code{001} through @code{366}).

@item %k
The hour as a decimal number, using a 24-hour clock like @code{%H}, but
padded with blank (range @code{ 0} through @code{23}).

This format is a GNU extension.

@item %l
The hour as a decimal number, using a 12-hour clock like @code{%I}, but
padded with blank (range @code{ 1} through @code{12}).

This format is a GNU extension.

@item %m
The month as a decimal number (range @code{01} through @code{12}).

@item %M
The minute as a decimal number (range @code{00} through @code{59}).

@item %n
A single @samp{\n} (newline) character.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %p
Either @samp{AM} or @samp{PM}, according to the given time value; or the
corresponding strings for the current locale.  Noon is treated as
@samp{PM} and midnight as @samp{AM}.  In most locales
@samp{AM}/@samp{PM} format is not supported, in such cases @code{"%p"}
yields an empty string.

@ignore
We currently have a problem with makeinfo.  Write @samp{AM} and @samp{am}
both results in `am'.  I.e., the difference in case is not visible anymore.
@end ignore
@item %P
Either @samp{am} or @samp{pm}, according to the given time value; or the
corresponding strings for the current locale, printed in lowercase
characters.  Noon is treated as @samp{pm} and midnight as @samp{am}.  In
most locales @samp{AM}/@samp{PM} format is not supported, in such cases
@code{"%P"} yields an empty string.

This format is a GNU extension.

@item %r
The complete calendar time using the AM/PM format of the current locale.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.
In the POSIX locale, this format is equivalent to @code{%I:%M:%S %p}.

@item %R
The hour and minute in decimal numbers using the format @code{%H:%M}.

This format was first standardized by @w{ISO C99} and by POSIX.1-2001
but was previously available as a GNU extension.

@item %s
The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC.
Leap seconds are not counted unless leap second support is available.

This format is a GNU extension.

@item %S
The seconds as a decimal number (range @code{00} through @code{60}).

@item %t
A single @samp{\t} (tabulator) character.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %T
The time of day using decimal numbers using the format @code{%H:%M:%S}.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %u
The day of the week as a decimal number (range @code{1} through
@code{7}), Monday being @code{1}.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %U
The week number of the current year as a decimal number (range @code{00}
through @code{53}), starting with the first Sunday as the first day of
the first week.  Days preceding the first Sunday in the year are
considered to be in week @code{00}.

@item %V
The @w{ISO 8601:1988} week number as a decimal number (range @code{01}
through @code{53}).  ISO weeks start with Monday and end with Sunday.
Week @code{01} of a year is the first week which has the majority of its
days in that year; this is equivalent to the week containing the year's
first Thursday, and it is also equivalent to the week containing January
4.  Week @code{01} of a year can contain days from the previous year.
The week before week @code{01} of a year is the last week (@code{52} or
@code{53}) of the previous year even if it contains days from the new
year.

This format was first standardized by POSIX.2-1992 and by @w{ISO C99}.

@item %w
The day of the week as a decimal number (range @code{0} through
@code{6}), Sunday being @code{0}.

@item %W
The week number of the current year as a decimal number (range @code{00}
through @code{53}), starting with the first Monday as the first day of
the first week.  All days preceding the first Monday in the year are
considered to be in week @code{00}.

@item %x
The preferred date representation for the current locale.

@item %X
The preferred time of day representation for the current locale.

@item %y
The year without a century as a decimal number (range @code{00} through
@code{99}).  This is equivalent to the year modulo 100.

@item %Y
The year as a decimal number, using the Gregorian calendar.  Years
before the year @code{1} are numbered @code{0}, @code{-1}, and so on.

@item %z
@w{RFC 822}/@w{ISO 8601:1988} style numeric time zone (e.g.,
@code{-0600} or @code{+0100}), or nothing if no time zone is
determinable.

This format was first standardized by @w{ISO C99} and by POSIX.1-2001
but was previously available as a GNU extension.

In the POSIX locale, a full @w{RFC 822} timestamp is generated by the format
@w{@samp{"%a, %d %b %Y %H:%M:%S %z"}} (or the equivalent
@w{@samp{"%a, %d %b %Y %T %z"}}).

@item %Z
The time zone abbreviation (empty if the time zone can't be determined).

@item %%
A literal @samp{%} character.
@end table

The @var{size} parameter can be used to specify the maximum number of
characters to be stored in the array @var{s}, including the terminating
null character.  If the formatted time requires more than @var{size}
characters, @code{strftime} returns zero and the contents of the array
@var{s} are undefined.  Otherwise the return value indicates the
number of characters placed in the array @var{s}, not including the
terminating null character.

@emph{Warning:} This convention for the return value which is prescribed
in @w{ISO C} can lead to problems in some situations.  For certain
format strings and certain locales the output really can be the empty
string and this cannot be discovered by testing the return value only.
E.g., in most locales the AM/PM time format is not supported (most of
the world uses the 24 hour time representation).  In such locales
@code{"%p"} will return the empty string, i.e., the return value is
zero.  To detect situations like this something similar to the following
code should be used:

@smallexample
buf[0] = '\1';
len = strftime (buf, bufsize, format, tp);
if (len == 0 && buf[0] != '\0')
  @{
    /* Something went wrong in the strftime call.  */
    @dots{}
  @}
@end smallexample

If @var{s} is a null pointer, @code{strftime} does not actually write
anything, but instead returns the number of characters it would have written.

According to POSIX.1 every call to @code{strftime} implies a call to
@code{tzset}.  So the contents of the environment variable @code{TZ}
is examined before any output is produced.

For an example of @code{strftime}, see @ref{Time Functions Example}.
@end deftypefun

@comment time.h
@comment ISO/Amend1
@deftypefun size_t wcsftime (wchar_t *@var{s}, size_t @var{size}, const wchar_t *@var{template}, const struct tm *@var{brokentime})
The @code{wcsftime} function is equivalent to the @code{strftime}
function with the difference that it operates on wide character
strings.  The buffer where the result is stored, pointed to by @var{s},
must be an array of wide characters.  The parameter @var{size} which
specifies the size of the output buffer gives the number of wide
character, not the number of bytes.

Also the format string @var{template} is a wide character string.  Since
all characters needed to specify the format string are in the basic
character set it is portably possible to write format strings in the C
source code using the @code{L"@dots{}"} notation.  The parameter
@var{brokentime} has the same meaning as in the @code{strftime} call.

The @code{wcsftime} function supports the same flags, modifiers, and
format specifiers as the @code{strftime} function.

The return value of @code{wcsftime} is the number of wide characters
stored in @code{s}.  When more characters would have to be written than
can be placed in the buffer @var{s} the return value is zero, with the
same problems indicated in the @code{strftime} documentation.
@end deftypefun

@node Parsing Date and Time
@subsection Convert textual time and date information back

The @w{ISO C} standard does not specify any functions which can convert
the output of the @code{strftime} function back into a binary format.
This led to a variety of more-or-less successful implementations with
different interfaces over the years.  Then the Unix standard was
extended by the addition of two functions: @code{strptime} and
@code{getdate}.  Both have strange interfaces but at least they are
widely available.

@menu
* Low-Level Time String Parsing::  Interpret string according to given format.
* General Time String Parsing::    User-friendly function to parse data and
                                    time strings.
@end menu

@node Low-Level Time String Parsing
@subsubsection Interpret string according to given format

The first function is rather low-level.  It is nevertheless frequently
used in software since it is better known.  Its interface and
implementation are heavily influenced by the @code{getdate} function,
which is defined and implemented in terms of calls to @code{strptime}.

@comment time.h
@comment XPG4
@deftypefun {char *} strptime (const char *@var{s}, const char *@var{fmt}, struct tm *@var{tp})
The @code{strptime} function parses the input string @var{s} according
to the format string @var{fmt} and stores its results in the
structure @var{tp}.

The input string could be generated by a @code{strftime} call or
obtained any other way.  It does not need to be in a human-recognizable
format; e.g. a date passed as @code{"02:1999:9"} is acceptable, even
though it is ambiguous without context.  As long as the format string
@var{fmt} matches the input string the function will succeed.

The user has to make sure, though, that the input can be parsed in a
unambiguous way.  The string @code{"1999112"} can be parsed using the
format @code{"%Y%m%d"} as 1999-1-12, 1999-11-2, or even 19991-1-2.  It
is necessary to add appropriate separators to reliably get results.

The format string consists of the same components as the format string
of the @code{strftime} function.  The only difference is that the flags
@code{_}, @code{-}, @code{0}, and @code{^} are not allowed.
@comment Is this really the intention?  --drepper
Several of the distinct formats of @code{strftime} do the same work in
@code{strptime} since differences like case of the input do not matter.
For reasons of symmetry all formats are supported, though.

The modifiers @code{E} and @code{O} are also allowed everywhere the
@code{strftime} function allows them.

The formats are:

@table @code
@item %a
@itemx %A
The weekday name according to the current locale, in abbreviated form or
the full name.

@item %b
@itemx %B
@itemx %h
The month name according to the current locale, in abbreviated form or
the full name.

@item %c
The date and time representation for the current locale.

@item %Ec
Like @code{%c} but the locale's alternative date and time format is used.

@item %C
The century of the year.

It makes sense to use this format only if the format string also
contains the @code{%y} format.

@item %EC
The locale's representation of the period.

Unlike @code{%C} it sometimes makes sense to use this format since some
cultures represent years relative to the beginning of eras instead of
using the Gregorian years.

@item %d
@item %e
The day of the month as a decimal number (range @code{1} through @code{31}).
Leading zeroes are permitted but not required.

@item %Od
@itemx %Oe
Same as @code{%d} but using the locale's alternative numeric symbols.

Leading zeroes are permitted but not required.

@item %D
Equivalent to @code{%m/%d/%y}.

@item %F
Equivalent to @code{%Y-%m-%d}, which is the @w{ISO 8601} date
format.

This is a GNU extension following an @w{ISO C99} extension to
@code{strftime}.

@item %g
The year corresponding to the ISO week number, but without the century
(range @code{00} through @code{99}).

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

This format is a GNU extension following a GNU extension of @code{strftime}.

@item %G
The year corresponding to the ISO week number.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

This format is a GNU extension following a GNU extension of @code{strftime}.

@item %H
@itemx %k
The hour as a decimal number, using a 24-hour clock (range @code{00} through
@code{23}).

@code{%k} is a GNU extension following a GNU extension of @code{strftime}.

@item %OH
Same as @code{%H} but using the locale's alternative numeric symbols.

@item %I
@itemx %l
The hour as a decimal number, using a 12-hour clock (range @code{01} through
@code{12}).

@code{%l} is a GNU extension following a GNU extension of @code{strftime}.

@item %OI
Same as @code{%I} but using the locale's alternative numeric symbols.

@item %j
The day of the year as a decimal number (range @code{1} through @code{366}).

Leading zeroes are permitted but not required.

@item %m
The month as a decimal number (range @code{1} through @code{12}).

Leading zeroes are permitted but not required.

@item %Om
Same as @code{%m} but using the locale's alternative numeric symbols.

@item %M
The minute as a decimal number (range @code{0} through @code{59}).

Leading zeroes are permitted but not required.

@item %OM
Same as @code{%M} but using the locale's alternative numeric symbols.

@item %n
@itemx %t
Matches any white space.

@item %p
@item %P
The locale-dependent equivalent to @samp{AM} or @samp{PM}.

This format is not useful unless @code{%I} or @code{%l} is also used.
Another complication is that the locale might not define these values at
all and therefore the conversion fails.

@code{%P} is a GNU extension following a GNU extension to @code{strftime}.

@item %r
The complete time using the AM/PM format of the current locale.

A complication is that the locale might not define this format at all
and therefore the conversion fails.

@item %R
The hour and minute in decimal numbers using the format @code{%H:%M}.

@code{%R} is a GNU extension following a GNU extension to @code{strftime}.

@item %s
The number of seconds since the epoch, i.e., since 1970-01-01 00:00:00 UTC.
Leap seconds are not counted unless leap second support is available.

@code{%s} is a GNU extension following a GNU extension to @code{strftime}.

@item %S
The seconds as a decimal number (range @code{0} through @code{60}).

Leading zeroes are permitted but not required.

@strong{NB:} The Unix specification says the upper bound on this value
is @code{61}, a result of a decision to allow double leap seconds.  You
will not see the value @code{61} because no minute has more than one
leap second, but the myth persists.

@item %OS
Same as @code{%S} but using the locale's alternative numeric symbols.

@item %T
Equivalent to the use of @code{%H:%M:%S} in this place.

@item %u
The day of the week as a decimal number (range @code{1} through
@code{7}), Monday being @code{1}.

Leading zeroes are permitted but not required.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

@item %U
The week number of the current year as a decimal number (range @code{0}
through @code{53}).

Leading zeroes are permitted but not required.

@item %OU
Same as @code{%U} but using the locale's alternative numeric symbols.

@item %V
The @w{ISO 8601:1988} week number as a decimal number (range @code{1}
through @code{53}).

Leading zeroes are permitted but not required.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

@item %w
The day of the week as a decimal number (range @code{0} through
@code{6}), Sunday being @code{0}.

Leading zeroes are permitted but not required.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

@item %Ow
Same as @code{%w} but using the locale's alternative numeric symbols.

@item %W
The week number of the current year as a decimal number (range @code{0}
through @code{53}).

Leading zeroes are permitted but not required.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

@item %OW
Same as @code{%W} but using the locale's alternative numeric symbols.

@item %x
The date using the locale's date format.

@item %Ex
Like @code{%x} but the locale's alternative data representation is used.

@item %X
The time using the locale's time format.

@item %EX
Like @code{%X} but the locale's alternative time representation is used.

@item %y
The year without a century as a decimal number (range @code{0} through
@code{99}).

Leading zeroes are permitted but not required.

Note that it is questionable to use this format without
the @code{%C} format.  The @code{strptime} function does regard input
values in the range @math{68} to @math{99} as the years @math{1969} to
@math{1999} and the values @math{0} to @math{68} as the years
@math{2000} to @math{2068}.  But maybe this heuristic fails for some
input data.

Therefore it is best to avoid @code{%y} completely and use @code{%Y}
instead.

@item %Ey
The offset from @code{%EC} in the locale's alternative representation.

@item %Oy
The offset of the year (from @code{%C}) using the locale's alternative
numeric symbols.

@item %Y
The year as a decimal number, using the Gregorian calendar.

@item %EY
The full alternative year representation.

@item %z
The offset from GMT in @w{ISO 8601}/RFC822 format.

@item %Z
The timezone name.

@emph{Note:} Currently, this is not fully implemented.  The format is
recognized, input is consumed but no field in @var{tm} is set.

@item %%
A literal @samp{%} character.
@end table

All other characters in the format string must have a matching character
in the input string.  Exceptions are white spaces in the input string
which can match zero or more whitespace characters in the format string.

@strong{Portability Note:} The XPG standard advises applications to use
at least one whitespace character (as specified by @code{isspace}) or
other non-alphanumeric characters between any two conversion
specifications.  The @w{GNU C Library} does not have this limitation but
other libraries might have trouble parsing formats like
@code{"%d%m%Y%H%M%S"}.

The @code{strptime} function processes the input string from right to
left.  Each of the three possible input elements (white space, literal,
or format) are handled one after the other.  If the input cannot be
matched to the format string the function stops.  The remainder of the
format and input strings are not processed.

The function returns a pointer to the first character it was unable to
process.  If the input string contains more characters than required by
the format string the return value points right after the last consumed
input character.  If the whole input string is consumed the return value
points to the @code{NULL} byte at the end of the string.  If an error
occurs, i.e., @code{strptime} fails to match all of the format string,
the function returns @code{NULL}.
@end deftypefun

The specification of the function in the XPG standard is rather vague,
leaving out a few important pieces of information.  Most importantly, it
does not specify what happens to those elements of @var{tm} which are
not directly initialized by the different formats.  The
implementations on different Unix systems vary here.

The GNU libc implementation does not touch those fields which are not
directly initialized.  Exceptions are the @code{tm_wday} and
@code{tm_yday} elements, which are recomputed if any of the year, month,
or date elements changed.  This has two implications:

@itemize @bullet
@item
Before calling the @code{strptime} function for a new input string, you
should prepare the @var{tm} structure you pass.  Normally this will mean
initializing all values are to zero.  Alternatively, you can set all
fields to values like @code{INT_MAX}, allowing you to determine which
elements were set by the function call.  Zero does not work here since
it is a valid value for many of the fields.

Careful initialization is necessary if you want to find out whether a
certain field in @var{tm} was initialized by the function call.

@item
You can construct a @code{struct tm} value with several consecutive
@code{strptime} calls.  A useful application of this is e.g. the parsing
of two separate strings, one containing date information and the other
time information.  By parsing one after the other without clearing the
structure in-between, you can construct a complete broken-down time.
@end itemize

The following example shows a function which parses a string which is
contains the date information in either US style or @w{ISO 8601} form:

@smallexample
const char *
parse_date (const char *input, struct tm *tm)
@{
  const char *cp;

  /* @r{First clear the result structure.}  */
  memset (tm, '\0', sizeof (*tm));

  /* @r{Try the ISO format first.}  */
  cp = strptime (input, "%F", tm);
  if (cp == NULL)
    @{
      /* @r{Does not match.  Try the US form.}  */
      cp = strptime (input, "%D", tm);
    @}

  return cp;
@}
@end smallexample

@node General Time String Parsing
@subsubsection A More User-friendly Way to Parse Times and Dates

The Unix standard defines another function for parsing date strings.
The interface is weird, but if the function happens to suit your
application it is just fine.  It is problematic to use this function
in multi-threaded programs or libraries, since it returns a pointer to
a static variable, and uses a global variable and global state (an
environment variable).

@comment time.h
@comment Unix98
@defvar getdate_err
This variable of type @code{int} contains the error code of the last
unsuccessful call to @code{getdate}.  Defined values are:

@table @math
@item 1
The environment variable @code{DATEMSK} is not defined or null.
@item 2
The template file denoted by the @code{DATEMSK} environment variable
cannot be opened.
@item 3
Information about the template file cannot retrieved.
@item 4
The template file is not a regular file.
@item 5
An I/O error occurred while reading the template file.
@item 6
Not enough memory available to execute the function.
@item 7
The template file contains no matching template.
@item 8
The input date is invalid, but would match a template otherwise.  This
includes dates like February 31st, and dates which cannot be represented
in a @code{time_t} variable.
@end table
@end defvar

@comment time.h
@comment Unix98
@deftypefun {struct tm *} getdate (const char *@var{string})
The interface to @code{getdate} is the simplest possible for a function
to parse a string and return the value.  @var{string} is the input
string and the result is returned in a statically-allocated variable.

The details about how the string is processed are hidden from the user.
In fact, they can be outside the control of the program.  Which formats
are recognized is controlled by the file named by the environment
variable @code{DATEMSK}.  This file should contain
lines of valid format strings which could be passed to @code{strptime}.

The @code{getdate} function reads these format strings one after the
other and tries to match the input string.  The first line which
completely matches the input string is used.

Elements not initialized through the format string retain the values
present at the time of the @code{getdate} function call.

The formats recognized by @code{getdate} are the same as for
@code{strptime}.  See above for an explanation.  There are only a few
extensions to the @code{strptime} behavior:

@itemize @bullet
@item
If the @code{%Z} format is given the broken-down time is based on the
current time of the timezone matched, not of the current timezone of the
runtime environment.

@emph{Note}: This is not implemented (currently).  The problem is that
timezone names are not unique.  If a fixed timezone is assumed for a
given string (say @code{EST} meaning US East Coast time), then uses for
countries other than the USA will fail.  So far we have found no good
solution to this.

@item
If only the weekday is specified the selected day depends on the current
date.  If the current weekday is greater or equal to the @code{tm_wday}
value the current week's day is chosen, otherwise the day next week is chosen.

@item
A similar heuristic is used when only the month is given and not the
year.  If the month is greater than or equal to the current month, then
the current year is used.  Otherwise it wraps to next year.  The first
day of the month is assumed if one is not explicitly specified.

@item
The current hour, minute, and second are used if the appropriate value is
not set through the format.

@item
If no date is given tomorrow's date is used if the time is
smaller than the current time.  Otherwise today's date is taken.
@end itemize

It should be noted that the format in the template file need not only
contain format elements.  The following is a list of possible format
strings (taken from the Unix standard):

@smallexample
%m
%A %B %d, %Y %H:%M:%S
%A
%B
%m/%d/%y %I %p
%d,%m,%Y %H:%M
at %A the %dst of %B in %Y
run job at %I %p,%B %dnd
%A den %d. %B %Y %H.%M Uhr
@end smallexample

As you can see, the template list can contain very specific strings like
@code{run job at %I %p,%B %dnd}.  Using the above list of templates and
assuming the current time is Mon Sep 22 12:19:47 EDT 1986 we can obtain the
following results for the given input.

@multitable {xxxxxxxxxxxx} {xxxxxxxxxx} {xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
@item        Input @tab     Match @tab Result
@item        Mon @tab       %a @tab    Mon Sep 22 12:19:47 EDT 1986
@item        Sun @tab       %a @tab    Sun Sep 28 12:19:47 EDT 1986
@item        Fri @tab       %a @tab    Fri Sep 26 12:19:47 EDT 1986
@item        September @tab %B @tab    Mon Sep 1 12:19:47 EDT 1986
@item        January @tab   %B @tab    Thu Jan 1 12:19:47 EST 1987
@item        December @tab  %B @tab    Mon Dec 1 12:19:47 EST 1986
@item        Sep Mon @tab   %b %a @tab Mon Sep 1 12:19:47 EDT 1986
@item        Jan Fri @tab   %b %a @tab Fri Jan 2 12:19:47 EST 1987
@item        Dec Mon @tab   %b %a @tab Mon Dec 1 12:19:47 EST 1986
@item        Jan Wed 1989 @tab  %b %a %Y @tab Wed Jan 4 12:19:47 EST 1989
@item        Fri 9 @tab     %a %H @tab Fri Sep 26 09:00:00 EDT 1986
@item        Feb 10:30 @tab %b %H:%S @tab Sun Feb 1 10:00:30 EST 1987
@item        10:30 @tab     %H:%M @tab Tue Sep 23 10:30:00 EDT 1986
@item        13:30 @tab     %H:%M @tab Mon Sep 22 13:30:00 EDT 1986
@end multitable

The return value of the function is a pointer to a static variable of
type @w{@code{struct tm}}, or a null pointer if an error occurred.  The
result is only valid until the next @code{getdate} call, making this
function unusable in multi-threaded applications.

The @code{errno} variable is @emph{not} changed.  Error conditions are
stored in the global variable @code{getdate_err}.  See the
description above for a list of the possible error values.

@emph{Warning:} The @code{getdate} function should @emph{never} be
used in SUID-programs.  The reason is obvious: using the
@code{DATEMSK} environment variable you can get the function to open
any arbitrary file and chances are high that with some bogus input
(such as a binary file) the program will crash.
@end deftypefun

@comment time.h
@comment GNU
@deftypefun int getdate_r (const char *@var{string}, struct tm *@var{tp})
The @code{getdate_r} function is the reentrant counterpart of
@code{getdate}.  It does not use the global variable @code{getdate_err}
to signal an error, but instead returns an error code.  The same error
codes as described in the @code{getdate_err} documentation above are
used, with 0 meaning success.

Moreover, @code{getdate_r} stores the broken-down time in the variable
of type @code{struct tm} pointed to by the second argument, rather than
in a static variable.

This function is not defined in the Unix standard.  Nevertheless it is
available on some other Unix systems as well.

The warning against using @code{getdate} in SUID-programs applies to
@code{getdate_r} as well.
@end deftypefun

@node TZ Variable
@subsection Specifying the Time Zone with @code{TZ}

In POSIX systems, a user can specify the time zone by means of the
@code{TZ} environment variable.  For information about how to set
environment variables, see @ref{Environment Variables}.  The functions
for accessing the time zone are declared in @file{time.h}.
@pindex time.h
@cindex time zone

You should not normally need to set @code{TZ}.  If the system is
configured properly, the default time zone will be correct.  You might
set @code{TZ} if you are using a computer over a network from a
different time zone, and would like times reported to you in the time
zone local to you, rather than what is local to the computer.

In POSIX.1 systems the value of the @code{TZ} variable can be in one of
three formats.  With the GNU C library, the most common format is the
last one, which can specify a selection from a large database of time
zone information for many regions of the world.  The first two formats
are used to describe the time zone information directly, which is both
more cumbersome and less precise.  But the POSIX.1 standard only
specifies the details of the first two formats, so it is good to be
familiar with them in case you come across a POSIX.1 system that doesn't
support a time zone information database.

The first format is used when there is no Daylight Saving Time (or
summer time) in the local time zone:

@smallexample
@r{@var{std} @var{offset}}
@end smallexample

The @var{std} string specifies the name of the time zone.  It must be
three or more characters long and must not contain a leading colon,
embedded digits, commas, nor plus and minus signs.  There is no space
character separating the time zone name from the @var{offset}, so these
restrictions are necessary to parse the specification correctly.

The @var{offset} specifies the time value you must add to the local time
to get a Coordinated Universal Time value.  It has syntax like
[@code{+}|@code{-}]@var{hh}[@code{:}@var{mm}[@code{:}@var{ss}]].  This
is positive if the local time zone is west of the Prime Meridian and
negative if it is east.  The hour must be between @code{0} and
@code{23}, and the minute and seconds between @code{0} and @code{59}.

For example, here is how we would specify Eastern Standard Time, but
without any Daylight Saving Time alternative:

@smallexample
EST+5
@end smallexample

The second format is used when there is Daylight Saving Time:

@smallexample
@r{@var{std} @var{offset} @var{dst} [@var{offset}]@code{,}@var{start}[@code{/}@var{time}]@code{,}@var{end}[@code{/}@var{time}]}
@end smallexample

The initial @var{std} and @var{offset} specify the standard time zone, as
described above.  The @var{dst} string and @var{offset} specify the name
and offset for the corresponding Daylight Saving Time zone; if the
@var{offset} is omitted, it defaults to one hour ahead of standard time.

The remainder of the specification describes when Daylight Saving Time is
in effect.  The @var{start} field is when Daylight Saving Time goes into
effect and the @var{end} field is when the change is made back to standard
time.  The following formats are recognized for these fields:

@table @code
@item J@var{n}
This specifies the Julian day, with @var{n} between @code{1} and @code{365}.
February 29 is never counted, even in leap years.

@item @var{n}
This specifies the Julian day, with @var{n} between @code{0} and @code{365}.
February 29 is counted in leap years.

@item M@var{m}.@var{w}.@var{d}
This specifies day @var{d} of week @var{w} of month @var{m}.  The day
@var{d} must be between @code{0} (Sunday) and @code{6}.  The week
@var{w} must be between @code{1} and @code{5}; week @code{1} is the
first week in which day @var{d} occurs, and week @code{5} specifies the
@emph{last} @var{d} day in the month.  The month @var{m} should be
between @code{1} and @code{12}.
@end table

The @var{time} fields specify when, in the local time currently in
effect, the change to the other time occurs.  If omitted, the default is
@code{02:00:00}.

For example, here is how you would specify the Eastern time zone in the
United States, including the appropriate Daylight Saving Time and its dates
of applicability.  The normal offset from UTC is 5 hours; since this is
west of the prime meridian, the sign is positive.  Summer time begins on
the first Sunday in April at 2:00am, and ends on the last Sunday in October
at 2:00am.

@smallexample
EST+5EDT,M4.1.0/2,M10.5.0/2
@end smallexample

The schedule of Daylight Saving Time in any particular jurisdiction has
changed over the years.  To be strictly correct, the conversion of dates
and times in the past should be based on the schedule that was in effect
then.  However, this format has no facilities to let you specify how the
schedule has changed from year to year.  The most you can do is specify
one particular schedule---usually the present day schedule---and this is
used to convert any date, no matter when.  For precise time zone
specifications, it is best to use the time zone information database
(see below).

The third format looks like this:

@smallexample
:@var{characters}
@end smallexample

Each operating system interprets this format differently; in the GNU C
library, @var{characters} is the name of a file which describes the time
zone.

@pindex /etc/localtime
@pindex localtime
If the @code{TZ} environment variable does not have a value, the
operation chooses a time zone by default.  In the GNU C library, the
default time zone is like the specification @samp{TZ=:/etc/localtime}
(or @samp{TZ=:/usr/local/etc/localtime}, depending on how GNU C library
was configured; @pxref{Installation}).  Other C libraries use their own
rule for choosing the default time zone, so there is little we can say
about them.

@cindex time zone database
@pindex /share/lib/zoneinfo
@pindex zoneinfo
If @var{characters} begins with a slash, it is an absolute file name;
otherwise the library looks for the file
@w{@file{/share/lib/zoneinfo/@var{characters}}}.  The @file{zoneinfo}
directory contains data files describing local time zones in many
different parts of the world.  The names represent major cities, with
subdirectories for geographical areas; for example,
@file{America/New_York}, @file{Europe/London}, @file{Asia/Hong_Kong}.
These data files are installed by the system administrator, who also
sets @file{/etc/localtime} to point to the data file for the local time
zone.  The GNU C library comes with a large database of time zone
information for most regions of the world, which is maintained by a
community of volunteers and put in the public domain.

@node Time Zone Functions
@subsection Functions and Variables for Time Zones

@comment time.h
@comment POSIX.1
@deftypevar {char *} tzname [2]
The array @code{tzname} contains two strings, which are the standard
names of the pair of time zones (standard and Daylight
Saving) that the user has selected.  @code{tzname[0]} is the name of
the standard time zone (for example, @code{"EST"}), and @code{tzname[1]}
is the name for the time zone when Daylight Saving Time is in use (for
example, @code{"EDT"}).  These correspond to the @var{std} and @var{dst}
strings (respectively) from the @code{TZ} environment variable.  If
Daylight Saving Time is never used, @code{tzname[1]} is the empty string.

The @code{tzname} array is initialized from the @code{TZ} environment
variable whenever @code{tzset}, @code{ctime}, @code{strftime},
@code{mktime}, or @code{localtime} is called.  If multiple abbreviations
have been used (e.g. @code{"EWT"} and @code{"EDT"} for U.S. Eastern War
Time and Eastern Daylight Time), the array contains the most recent
abbreviation.

The @code{tzname} array is required for POSIX.1 compatibility, but in
GNU programs it is better to use the @code{tm_zone} member of the
broken-down time structure, since @code{tm_zone} reports the correct
abbreviation even when it is not the latest one.

Though the strings are declared as @code{char *} the user must refrain
from modifying these strings.  Modifying the strings will almost certainly
lead to trouble.

@end deftypevar

@comment time.h
@comment POSIX.1
@deftypefun void tzset (void)
The @code{tzset} function initializes the @code{tzname} variable from
the value of the @code{TZ} environment variable.  It is not usually
necessary for your program to call this function, because it is called
automatically when you use the other time conversion functions that
depend on the time zone.
@end deftypefun

The following variables are defined for compatibility with System V
Unix.  Like @code{tzname}, these variables are set by calling
@code{tzset} or the other time conversion functions.

@comment time.h
@comment SVID
@deftypevar {long int} timezone
This contains the difference between UTC and the latest local standard
time, in seconds west of UTC.  For example, in the U.S. Eastern time
zone, the value is @code{5*60*60}.  Unlike the @code{tm_gmtoff} member
of the broken-down time structure, this value is not adjusted for
daylight saving, and its sign is reversed.  In GNU programs it is better
to use @code{tm_gmtoff}, since it contains the correct offset even when
it is not the latest one.
@end deftypevar

@comment time.h
@comment SVID
@deftypevar int daylight
This variable has a nonzero value if Daylight Saving Time rules apply.
A nonzero value does not necessarily mean that Daylight Saving Time is
now in effect; it means only that Daylight Saving Time is sometimes in
effect.
@end deftypevar

@node Time Functions Example
@subsection Time Functions Example

Here is an example program showing the use of some of the calendar time
functions.

@smallexample
@include strftim.c.texi
@end smallexample

It produces output like this:

@smallexample
Wed Jul 31 13:02:36 1991
Today is Wednesday, July 31.
The time is 01:02 PM.
@end smallexample


@node Setting an Alarm
@section Setting an Alarm

The @code{alarm} and @code{setitimer} functions provide a mechanism for a
process to interrupt itself in the future.  They do this by setting a
timer; when the timer expires, the process receives a signal.

@cindex setting an alarm
@cindex interval timer, setting
@cindex alarms, setting
@cindex timers, setting
Each process has three independent interval timers available:

@itemize @bullet
@item
A real-time timer that counts elapsed time.  This timer sends a
@code{SIGALRM} signal to the process when it expires.
@cindex real-time timer
@cindex timer, real-time

@item
A virtual timer that counts processor time used by the process.  This timer
sends a @code{SIGVTALRM} signal to the process when it expires.
@cindex virtual timer
@cindex timer, virtual

@item
A profiling timer that counts both processor time used by the process,
and processor time spent in system calls on behalf of the process.  This
timer sends a @code{SIGPROF} signal to the process when it expires.
@cindex profiling timer
@cindex timer, profiling

This timer is useful for profiling in interpreters.  The interval timer
mechanism does not have the fine granularity necessary for profiling
native code.
@c @xref{profil} !!!
@end itemize

You can only have one timer of each kind set at any given time.  If you
set a timer that has not yet expired, that timer is simply reset to the
new value.

You should establish a handler for the appropriate alarm signal using
@code{signal} or @code{sigaction} before issuing a call to
@code{setitimer} or @code{alarm}.  Otherwise, an unusual chain of events
could cause the timer to expire before your program establishes the
handler.  In this case it would be terminated, since termination is the
default action for the alarm signals.  @xref{Signal Handling}.

To be able to use the alarm function to interrupt a system call which
might block otherwise indefinitely it is important to @emph{not} set the
@code{SA_RESTART} flag when registering the signal handler using
@code{sigaction}.  When not using @code{sigaction} things get even
uglier: the @code{signal} function has to fixed semantics with respect
to restarts.  The BSD semantics for this function is to set the flag.
Therefore, if @code{sigaction} for whatever reason cannot be used, it is
necessary to use @code{sysv_signal} and not @code{signal}.

The @code{setitimer} function is the primary means for setting an alarm.
This facility is declared in the header file @file{sys/time.h}.  The
@code{alarm} function, declared in @file{unistd.h}, provides a somewhat
simpler interface for setting the real-time timer.
@pindex unistd.h
@pindex sys/time.h

@comment sys/time.h
@comment BSD
@deftp {Data Type} {struct itimerval}
This structure is used to specify when a timer should expire.  It contains
the following members:
@table @code
@item struct timeval it_interval
This is the period between successive timer interrupts.  If zero, the
alarm will only be sent once.

@item struct timeval it_value
This is the period between now and the first timer interrupt.  If zero,
the alarm is disabled.
@end table

The @code{struct timeval} data type is described in @ref{Elapsed Time}.
@end deftp

@comment sys/time.h
@comment BSD
@deftypefun int setitimer (int @var{which}, struct itimerval *@var{new}, struct itimerval *@var{old})
The @code{setitimer} function sets the timer specified by @var{which}
according to @var{new}.  The @var{which} argument can have a value of
@code{ITIMER_REAL}, @code{ITIMER_VIRTUAL}, or @code{ITIMER_PROF}.

If @var{old} is not a null pointer, @code{setitimer} returns information
about any previous unexpired timer of the same kind in the structure it
points to.

The return value is @code{0} on success and @code{-1} on failure.  The
following @code{errno} error conditions are defined for this function:

@table @code
@item EINVAL
The timer period is too large.
@end table
@end deftypefun

@comment sys/time.h
@comment BSD
@deftypefun int getitimer (int @var{which}, struct itimerval *@var{old})
The @code{getitimer} function stores information about the timer specified
by @var{which} in the structure pointed at by @var{old}.

The return value and error conditions are the same as for @code{setitimer}.
@end deftypefun

@comment sys/time.h
@comment BSD
@vtable @code
@item ITIMER_REAL
This constant can be used as the @var{which} argument to the
@code{setitimer} and @code{getitimer} functions to specify the real-time
timer.

@comment sys/time.h
@comment BSD
@item ITIMER_VIRTUAL
This constant can be used as the @var{which} argument to the
@code{setitimer} and @code{getitimer} functions to specify the virtual
timer.

@comment sys/time.h
@comment BSD
@item ITIMER_PROF
This constant can be used as the @var{which} argument to the
@code{setitimer} and @code{getitimer} functions to specify the profiling
timer.
@end vtable

@comment unistd.h
@comment POSIX.1
@deftypefun {unsigned int} alarm (unsigned int @var{seconds})
The @code{alarm} function sets the real-time timer to expire in
@var{seconds} seconds.  If you want to cancel any existing alarm, you
can do this by calling @code{alarm} with a @var{seconds} argument of
zero.

The return value indicates how many seconds remain before the previous
alarm would have been sent.  If there is no previous alarm, @code{alarm}
returns zero.
@end deftypefun

The @code{alarm} function could be defined in terms of @code{setitimer}
like this:

@smallexample
unsigned int
alarm (unsigned int seconds)
@{
  struct itimerval old, new;
  new.it_interval.tv_usec = 0;
  new.it_interval.tv_sec = 0;
  new.it_value.tv_usec = 0;
  new.it_value.tv_sec = (long int) seconds;
  if (setitimer (ITIMER_REAL, &new, &old) < 0)
    return 0;
  else
    return old.it_value.tv_sec;
@}
@end smallexample

There is an example showing the use of the @code{alarm} function in
@ref{Handler Returns}.

If you simply want your process to wait for a given number of seconds,
you should use the @code{sleep} function.  @xref{Sleeping}.

You shouldn't count on the signal arriving precisely when the timer
expires.  In a multiprocessing environment there is typically some
amount of delay involved.

@strong{Portability Note:} The @code{setitimer} and @code{getitimer}
functions are derived from BSD Unix, while the @code{alarm} function is
specified by the POSIX.1 standard.  @code{setitimer} is more powerful than
@code{alarm}, but @code{alarm} is more widely used.

@node Sleeping
@section Sleeping

The function @code{sleep} gives a simple way to make the program wait
for a short interval.  If your program doesn't use signals (except to
terminate), then you can expect @code{sleep} to wait reliably throughout
the specified interval.  Otherwise, @code{sleep} can return sooner if a
signal arrives; if you want to wait for a given interval regardless of
signals, use @code{select} (@pxref{Waiting for I/O}) and don't specify
any descriptors to wait for.
@c !!! select can get EINTR; using SA_RESTART makes sleep win too.

@comment unistd.h
@comment POSIX.1
@deftypefun {unsigned int} sleep (unsigned int @var{seconds})
The @code{sleep} function waits for @var{seconds} or until a signal
is delivered, whichever happens first.

If @code{sleep} function returns because the requested interval is over,
it returns a value of zero.  If it returns because of delivery of a
signal, its return value is the remaining time in the sleep interval.

The @code{sleep} function is declared in @file{unistd.h}.
@end deftypefun

Resist the temptation to implement a sleep for a fixed amount of time by
using the return value of @code{sleep}, when nonzero, to call
@code{sleep} again.  This will work with a certain amount of accuracy as
long as signals arrive infrequently.  But each signal can cause the
eventual wakeup time to be off by an additional second or so.  Suppose a
few signals happen to arrive in rapid succession by bad luck---there is
no limit on how much this could shorten or lengthen the wait.

Instead, compute the calendar time at which the program should stop
waiting, and keep trying to wait until that calendar time.  This won't
be off by more than a second.  With just a little more work, you can use
@code{select} and make the waiting period quite accurate.  (Of course,
heavy system load can cause additional unavoidable delays---unless the
machine is dedicated to one application, there is no way you can avoid
this.)

On some systems, @code{sleep} can do strange things if your program uses
@code{SIGALRM} explicitly.  Even if @code{SIGALRM} signals are being
ignored or blocked when @code{sleep} is called, @code{sleep} might
return prematurely on delivery of a @code{SIGALRM} signal.  If you have
established a handler for @code{SIGALRM} signals and a @code{SIGALRM}
signal is delivered while the process is sleeping, the action taken
might be just to cause @code{sleep} to return instead of invoking your
handler.  And, if @code{sleep} is interrupted by delivery of a signal
whose handler requests an alarm or alters the handling of @code{SIGALRM},
this handler and @code{sleep} will interfere.

On the GNU system, it is safe to use @code{sleep} and @code{SIGALRM} in
the same program, because @code{sleep} does not work by means of
@code{SIGALRM}.

@comment time.h
@comment POSIX.1
@deftypefun int nanosleep (const struct timespec *@var{requested_time}, struct timespec *@var{remaining})
If resolution to seconds is not enough the @code{nanosleep} function can
be used.  As the name suggests the sleep interval can be specified in
nanoseconds.  The actual elapsed time of the sleep interval might be
longer since the system rounds the elapsed time you request up to the
next integer multiple of the actual resolution the system can deliver.

*@code{requested_time} is the elapsed time of the interval you want to
sleep.

The function returns as *@code{remaining} the elapsed time left in the
interval for which you requested to sleep.  If the interval completed
without getting interrupted by a signal, this is zero.

@code{struct timespec} is described in @xref{Elapsed Time}.

If the function returns because the interval is over the return value is
zero.  If the function returns @math{-1} the global variable @var{errno}
is set to the following values:

@table @code
@item EINTR
The call was interrupted because a signal was delivered to the thread.
If the @var{remaining} parameter is not the null pointer the structure
pointed to by @var{remaining} is updated to contain the remaining
elapsed time.

@item EINVAL
The nanosecond value in the @var{requested_time} parameter contains an
illegal value.  Either the value is negative or greater than or equal to
1000 million.
@end table

This function is a cancellation point in multi-threaded programs.  This
is a problem if the thread allocates some resources (like memory, file
descriptors, semaphores or whatever) at the time @code{nanosleep} is
called.  If the thread gets canceled these resources stay allocated
until the program ends.  To avoid this calls to @code{nanosleep} should
be protected using cancellation handlers.
@c ref pthread_cleanup_push / pthread_cleanup_pop

The @code{nanosleep} function is declared in @file{time.h}.
@end deftypefun
