mirror of
https://git.rtems.org/rtems-docs/
synced 2025-05-15 01:56:39 +08:00
Split document into seperate files by section.
This commit is contained in:
parent
ec76eca9cc
commit
1264a8f108
323
posix_users/clock.rst
Normal file
323
posix_users/clock.rst
Normal file
@ -0,0 +1,323 @@
|
||||
Clock Manager
|
||||
#############
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The clock manager provides services two primary classes
|
||||
of services. The first focuses on obtaining and setting
|
||||
the current date and time. The other category of services
|
||||
focus on allowing a thread to delay for a specific length
|
||||
of time.
|
||||
|
||||
The directives provided by the clock manager are:
|
||||
|
||||
- ``clock_gettime`` - Obtain Time of Day
|
||||
|
||||
- ``clock_settime`` - Set Time of Day
|
||||
|
||||
- ``clock_getres`` - Get Clock Resolution
|
||||
|
||||
- ``sleep`` - Delay Process Execution
|
||||
|
||||
- ``usleep`` - Delay Process Execution in Microseconds
|
||||
|
||||
- ``nanosleep`` - Delay with High Resolution
|
||||
|
||||
- ``gettimeofday`` - Get the Time of Day
|
||||
|
||||
- ``time`` - Get time in seconds
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the clock manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
clock_gettime - Obtain Time of Day
|
||||
----------------------------------
|
||||
.. index:: clock_gettime
|
||||
.. index:: obtain time of day
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int clock_gettime(
|
||||
clockid_t clock_id,
|
||||
struct timespec \*tp
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINVAL*
|
||||
The tp pointer parameter is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The clock_id specified is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
clock_settime - Set Time of Day
|
||||
-------------------------------
|
||||
.. index:: clock_settime
|
||||
.. index:: set time of day
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int clock_settime(
|
||||
clockid_t clock_id,
|
||||
const struct timespec \*tp
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINVAL*
|
||||
The tp pointer parameter is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The clock_id specified is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The contents of the tp structure are invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
clock_getres - Get Clock Resolution
|
||||
-----------------------------------
|
||||
.. index:: clock_getres
|
||||
.. index:: get clock resolution
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int clock_getres(
|
||||
clockid_t clock_id,
|
||||
struct timespec \*res
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINVAL*
|
||||
The res pointer parameter is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The clock_id specified is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If res is NULL, then the resolution is not returned.
|
||||
|
||||
sleep - Delay Process Execution
|
||||
-------------------------------
|
||||
.. index:: sleep
|
||||
.. index:: delay process execution
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
unsigned int sleep(
|
||||
unsigned int seconds
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine returns the number of unslept seconds.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``sleep()`` function delays the calling thread by the specified
|
||||
number of ``seconds``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This call is interruptible by a signal.
|
||||
|
||||
usleep - Delay Process Execution in Microseconds
|
||||
------------------------------------------------
|
||||
.. index:: usleep
|
||||
.. index:: delay process execution
|
||||
.. index:: delay process execution
|
||||
.. index:: usecs delay process execution
|
||||
.. index:: microsecond delay process execution
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
useconds_t usleep(
|
||||
useconds_t useconds
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine returns the number of unslept seconds.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``sleep()`` function delays the calling thread by the specified
|
||||
number of ``seconds``.
|
||||
|
||||
The ``usleep()`` function suspends the calling thread from execution
|
||||
until either the number of microseconds specified by the``useconds`` argument has elapsed or a signal is delivered to the
|
||||
calling thread and its action is to invoke a signal-catching function
|
||||
or to terminate the process.
|
||||
|
||||
Because of other activity, or because of the time spent in
|
||||
processing the call, the actual length of time the thread is
|
||||
blocked may be longer than
|
||||
the amount of time specified.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This call is interruptible by a signal.
|
||||
|
||||
The Single UNIX Specification allows this service to be implemented using
|
||||
the same timer as that used by the ``alarm()`` service. This is*NOT* the case for *RTEMS* and this call has no interaction with
|
||||
the ``SIGALRM`` signal.
|
||||
|
||||
nanosleep - Delay with High Resolution
|
||||
--------------------------------------
|
||||
.. index:: nanosleep
|
||||
.. index:: delay with high resolution
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int nanosleep(
|
||||
const struct timespec \*rqtp,
|
||||
struct timespec \*rmtp
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINTR*
|
||||
The routine was interrupted by a signal.
|
||||
|
||||
*EAGAIN*
|
||||
The requested sleep period specified negative seconds or nanoseconds.
|
||||
|
||||
*EINVAL*
|
||||
The requested sleep period specified an invalid number for the nanoseconds
|
||||
field.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This call is interruptible by a signal.
|
||||
|
||||
gettimeofday - Get the Time of Day
|
||||
----------------------------------
|
||||
.. index:: gettimeofday
|
||||
.. index:: get the time of day
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
int gettimeofday(
|
||||
struct timeval \*tp,
|
||||
struct timezone \*tzp
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets ``errno`` as appropriate.
|
||||
|
||||
*EPERM*
|
||||
``settimeofdat`` is called by someone other than the superuser.
|
||||
|
||||
*EINVAL*
|
||||
Timezone (or something else) is invalid.
|
||||
|
||||
*EFAULT*
|
||||
One of ``tv`` or ``tz`` pointed outside your accessible address
|
||||
space
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine returns the current time of day in the ``tp`` structure.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Currently, the timezone information is not supported. The ``tzp``
|
||||
argument is ignored.
|
||||
|
||||
time - Get time in seconds
|
||||
--------------------------
|
||||
.. index:: time
|
||||
.. index:: get time in seconds
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int time(
|
||||
time_t \*tloc
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine returns the number of seconds since the Epoch.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``time`` returns the time since 00:00:00 GMT, January 1, 1970,
|
||||
measured in seconds
|
||||
|
||||
If ``tloc`` in non null, the return value is also stored in the
|
||||
memory pointed to by ``t``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
.. COMMENT: This is the chapter from the RTEMS POSIX 1003.1b API User's Guide that
|
||||
|
||||
.. COMMENT: documents the services provided by the timer @c manager.
|
||||
|
5
posix_users/command.rst
Normal file
5
posix_users/command.rst
Normal file
@ -0,0 +1,5 @@
|
||||
Command and Variable Index
|
||||
##########################
|
||||
|
||||
.. COMMENT: There are currently no Command and Variable Index entries.
|
||||
|
320
posix_users/condition_variable.rst
Normal file
320
posix_users/condition_variable.rst
Normal file
@ -0,0 +1,320 @@
|
||||
Condition Variable Manager
|
||||
##########################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The condition variable manager ...
|
||||
|
||||
The directives provided by the condition variable manager are:
|
||||
|
||||
- ``pthread_condattr_init`` - Initialize a Condition Variable Attribute Set
|
||||
|
||||
- ``pthread_condattr_destroy`` - Destroy a Condition Variable Attribute Set
|
||||
|
||||
- ``pthread_condattr_setpshared`` - Set Process Shared Attribute
|
||||
|
||||
- ``pthread_condattr_getpshared`` - Get Process Shared Attribute
|
||||
|
||||
- ``pthread_cond_init`` - Initialize a Condition Variable
|
||||
|
||||
- ``pthread_cond_destroy`` - Destroy a Condition Variable
|
||||
|
||||
- ``pthread_cond_signal`` - Signal a Condition Variable
|
||||
|
||||
- ``pthread_cond_broadcast`` - Broadcast a Condition Variable
|
||||
|
||||
- ``pthread_cond_wait`` - Wait on a Condition Variable
|
||||
|
||||
- ``pthread_cond_timedwait`` - With with Timeout a Condition Variable
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the condition variable manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
pthread_condattr_init - Initialize a Condition Variable Attribute Set
|
||||
---------------------------------------------------------------------
|
||||
.. index:: pthread_condattr_init
|
||||
.. index:: initialize a condition variable attribute set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_condattr_init(
|
||||
pthread_condattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOMEM*
|
||||
Insufficient memory is available to initialize the condition variable
|
||||
attributes object.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_condattr_destroy - Destroy a Condition Variable Attribute Set
|
||||
---------------------------------------------------------------------
|
||||
.. index:: pthread_condattr_destroy
|
||||
.. index:: destroy a condition variable attribute set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_condattr_destroy(
|
||||
pthread_condattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute object specified is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_condattr_setpshared - Set Process Shared Attribute
|
||||
----------------------------------------------------------
|
||||
.. index:: pthread_condattr_setpshared
|
||||
.. index:: set process shared attribute
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_condattr_setpshared(
|
||||
pthread_condattr_t \*attr,
|
||||
int pshared
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_condattr_getpshared - Get Process Shared Attribute
|
||||
----------------------------------------------------------
|
||||
.. index:: pthread_condattr_getpshared
|
||||
.. index:: get process shared attribute
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_condattr_getpshared(
|
||||
const pthread_condattr_t \*attr,
|
||||
int \*pshared
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cond_init - Initialize a Condition Variable
|
||||
---------------------------------------------------
|
||||
.. index:: pthread_cond_init
|
||||
.. index:: initialize a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_init(
|
||||
pthread_cond_t \*cond,
|
||||
const pthread_condattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EAGAIN*
|
||||
The system lacked a resource other than memory necessary to create the
|
||||
initialize the condition variable object.
|
||||
|
||||
*ENOMEM*
|
||||
Insufficient memory is available to initialize the condition variable object.
|
||||
|
||||
*EBUSY*
|
||||
The specified condition variable has already been initialized.
|
||||
|
||||
*EINVAL*
|
||||
The specified attribute value is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cond_destroy - Destroy a Condition Variable
|
||||
---------------------------------------------------
|
||||
.. index:: pthread_cond_destroy
|
||||
.. index:: destroy a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_destroy(
|
||||
pthread_cond_t \*cond
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified condition variable is invalid.
|
||||
|
||||
*EBUSY*
|
||||
The specified condition variable is currently in use.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cond_signal - Signal a Condition Variable
|
||||
-------------------------------------------------
|
||||
.. index:: pthread_cond_signal
|
||||
.. index:: signal a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_signal(
|
||||
pthread_cond_t \*cond
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified condition variable is not valid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine should not be invoked from a handler from an asynchronous signal
|
||||
handler or an interrupt service routine.
|
||||
|
||||
pthread_cond_broadcast - Broadcast a Condition Variable
|
||||
-------------------------------------------------------
|
||||
.. index:: pthread_cond_broadcast
|
||||
.. index:: broadcast a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_broadcast(
|
||||
pthread_cond_t \*cond
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified condition variable is not valid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine should not be invoked from a handler from an asynchronous signal
|
||||
handler or an interrupt service routine.
|
||||
|
||||
pthread_cond_wait - Wait on a Condition Variable
|
||||
------------------------------------------------
|
||||
.. index:: pthread_cond_wait
|
||||
.. index:: wait on a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_wait(
|
||||
pthread_cond_t \*cond,
|
||||
pthread_mutex_t \*mutex
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified condition variable or mutex is not initialized OR different
|
||||
mutexes were specified for concurrent pthread_cond_wait() and
|
||||
pthread_cond_timedwait() operations on the same condition variable OR
|
||||
the mutex was not owned by the current thread at the time of the call.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cond_timedwait - Wait with Timeout a Condition Variable
|
||||
---------------------------------------------------------------
|
||||
.. index:: pthread_cond_timedwait
|
||||
.. index:: wait with timeout a condition variable
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_cond_timedwait(
|
||||
pthread_cond_t \*cond,
|
||||
pthread_mutex_t \*mutex,
|
||||
const struct timespec \*abstime
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified condition variable or mutex is not initialized OR different
|
||||
mutexes were specified for concurrent pthread_cond_wait() and
|
||||
pthread_cond_timedwait() operations on the same condition variable OR
|
||||
the mutex was not owned by the current thread at the time of the call.
|
||||
|
||||
*ETIMEDOUT*
|
||||
The specified time has elapsed without the condition variable being
|
||||
satisfied.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
411
posix_users/device_and_class_specific.rst
Normal file
411
posix_users/device_and_class_specific.rst
Normal file
@ -0,0 +1,411 @@
|
||||
Device- and Class- Specific Functions Manager
|
||||
#############################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The device- and class- specific functions manager is ...
|
||||
|
||||
The directives provided by the device- and class- specific functions
|
||||
manager are:
|
||||
|
||||
- ``cfgetispeed`` - Reads terminal input baud rate
|
||||
|
||||
- ``cfgetospeed`` - Reads terminal output baud rate
|
||||
|
||||
- ``cfsetispeed`` - Sets terminal input baud rate
|
||||
|
||||
- ``cfsetospeed`` - Set terminal output baud rate
|
||||
|
||||
- ``tcgetattr`` - Gets terminal attributes
|
||||
|
||||
- ``tcsetattr`` - Set terminal attributes
|
||||
|
||||
- ``tcsendbreak`` - Sends a break to a terminal
|
||||
|
||||
- ``tcdrain`` - Waits for all output to be transmitted to the terminal
|
||||
|
||||
- ``tcflush`` - Discards terminal data
|
||||
|
||||
- ``tcflow`` - Suspends/restarts terminal output
|
||||
|
||||
- ``tcgetpgrp`` - Gets foreground process group ID
|
||||
|
||||
- ``tcsetpgrp`` - Sets foreground process group ID
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the device- and class- specific functions manager’s
|
||||
directives. A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
cfgetispeed - Reads terminal input baud rate
|
||||
--------------------------------------------
|
||||
.. index:: cfgetispeed
|
||||
.. index:: reads terminal input baud rate
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
int cfgetispeed(
|
||||
const struct termios \*p
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The ``cfgetispeed()`` function returns a code for baud rate.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``cfsetispeed()`` function stores a code for the terminal speed
|
||||
stored in a struct termios. The codes are defined in ``<termios.h>``
|
||||
by the macros BO, B50, B75, B110, B134, B150, B200, B300, B600, B1200,
|
||||
B1800, B2400, B4800, B9600, B19200, and B38400.
|
||||
|
||||
The ``cfsetispeed()`` function does not do anything to the hardware.
|
||||
It merely stores a value for use by ``tcsetattr()``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Baud rates are defined by symbols, such as B110, B1200, B2400. The actual
|
||||
number returned for any given speed may change from system to system.
|
||||
|
||||
cfgetospeed - Reads terminal output baud rate
|
||||
---------------------------------------------
|
||||
.. index:: cfgetospeed
|
||||
.. index:: reads terminal output baud rate
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
int cfgetospeed(
|
||||
const struct termios \*p
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The ``cfgetospeed()`` function returns the termios code for the baud rate.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``cfgetospeed()`` function returns a code for the terminal speed
|
||||
stored in a ``struct termios``. The codes are defined in ``<termios.h>``
|
||||
by the macros BO, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800,
|
||||
B2400, B4800, B9600, B19200, and B38400.
|
||||
|
||||
The ``cfgetospeed()`` function does not do anything to the hardware.
|
||||
It merely returns the value stored by a previous call to ``tcgetattr()``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Baud rates are defined by symbols, such as B110, B1200, B2400. The actual
|
||||
number returned for any given speed may change from system to system.
|
||||
|
||||
cfsetispeed - Sets terminal input baud rate
|
||||
-------------------------------------------
|
||||
.. index:: cfsetispeed
|
||||
.. index:: sets terminal input baud rate
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
int cfsetispeed(
|
||||
struct termios \*p,
|
||||
speed_t speed
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The ``cfsetispeed()`` function returns a zero when successful and
|
||||
returns -1 when an error occurs.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``cfsetispeed()`` function stores a code for the terminal speed
|
||||
stored in a struct termios. The codes are defined in ``<termios.h>``
|
||||
by the macros B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200,
|
||||
B1800, B2400, B4800, B9600, B19200, and B38400.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This function merely stores a value in the ``termios`` structure. It
|
||||
does not change the terminal speed until a ``tcsetattr()`` is done.
|
||||
It does not detect impossible terminal speeds.
|
||||
|
||||
cfsetospeed - Sets terminal output baud rate
|
||||
--------------------------------------------
|
||||
.. index:: cfsetospeed
|
||||
.. index:: sets terminal output baud rate
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
int cfsetospeed(
|
||||
struct termios \*p,
|
||||
speed_t speed
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The ``cfsetospeed()`` function returns a zero when successful and
|
||||
returns -1 when an error occurs.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``cfsetospeed()`` function stores a code for the terminal speed stored
|
||||
in a struct ``termios``. The codes are defiined in ``<termios.h>`` by the
|
||||
macros B0, B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400,
|
||||
B4800, B9600, B19200, and B38400.
|
||||
|
||||
The ``cfsetospeed()`` function does not do anything to the hardware. It
|
||||
merely stores a value for use by ``tcsetattr()``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This function merely stores a value in the ``termios`` structure.
|
||||
It does not change the terminal speed until a ``tcsetattr()`` is done.
|
||||
It does not detect impossible terminal speeds.
|
||||
|
||||
tcgetattr - Gets terminal attributes
|
||||
------------------------------------
|
||||
.. index:: tcgetattr
|
||||
.. index:: gets terminal attributes
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
int tcgetattr(
|
||||
int fildes,
|
||||
struct termios \*p
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*ENOOTY*
|
||||
Terminal control function attempted for a file that is not a terminal.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``tcgetattr()`` gets the parameters associated with the terminal
|
||||
referred to by ``fildes`` and stores them into the ``termios()``
|
||||
structure pointed to by ``termios_p``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
tcsetattr - Set terminal attributes
|
||||
-----------------------------------
|
||||
.. index:: tcsetattr
|
||||
.. index:: set terminal attributes
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
int tcsetattr(
|
||||
int fildes,
|
||||
int options,
|
||||
const struct termios \*tp
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
tcsendbreak - Sends a break to a terminal
|
||||
-----------------------------------------
|
||||
.. index:: tcsendbreak
|
||||
.. index:: sends a break to a terminal
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tcsendbreak(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
tcdrain - Waits for all output to be transmitted to the terminal.
|
||||
-----------------------------------------------------------------
|
||||
.. index:: tcdrain
|
||||
.. index:: waits for all output to be transmitted to the terminal.
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
int tcdrain(
|
||||
int fildes
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*EINTR*
|
||||
Function was interrupted by a signal
|
||||
|
||||
*ENOTTY*
|
||||
Terminal control function attempted for a file that is not a terminal.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``tcdrain()`` function waits until all output written to``fildes`` has been transmitted.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
tcflush - Discards terminal data
|
||||
--------------------------------
|
||||
.. index:: tcflush
|
||||
.. index:: discards terminal data
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tcflush(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
tcflow - Suspends/restarts terminal output.
|
||||
-------------------------------------------
|
||||
.. index:: tcflow
|
||||
.. index:: suspends/restarts terminal output.
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tcflow(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
tcgetpgrp - Gets foreground process group ID
|
||||
--------------------------------------------
|
||||
.. index:: tcgetpgrp
|
||||
.. index:: gets foreground process group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tcgetpgrp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
tcsetpgrp - Sets foreground process group ID
|
||||
--------------------------------------------
|
||||
.. index:: tcsetpgrp
|
||||
.. index:: sets foreground process group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tcsetpgrp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
1947
posix_users/files_and_directory.rst
Normal file
1947
posix_users/files_and_directory.rst
Normal file
File diff suppressed because it is too large
Load Diff
@ -1 +1,70 @@
|
||||
.. include:: posix_users.rst
|
||||
============================
|
||||
RTEMS POSIX API User’s Guide
|
||||
============================
|
||||
|
||||
COPYRIGHT © 1988 - 2015.
|
||||
|
||||
On-Line Applications Research Corporation (OAR).
|
||||
|
||||
The authors have used their best efforts in preparing
|
||||
this material. These efforts include the development, research,
|
||||
and testing of the theories and programs to determine their
|
||||
effectiveness. No warranty of any kind, expressed or implied,
|
||||
with regard to the software or the material contained in this
|
||||
document is provided. No liability arising out of the
|
||||
application or use of any product described in this document is
|
||||
assumed. The authors reserve the right to revise this material
|
||||
and to make changes from time to time in the content hereof
|
||||
without obligation to notify anyone of such revision or changes.
|
||||
|
||||
The RTEMS Project is hosted at http://www.rtems.org. Any
|
||||
inquiries concerning RTEMS, its related support components, or its
|
||||
documentation should be directed to the Community Project hosted athttp://www.rtems.org.
|
||||
|
||||
Any inquiries for commercial services including training, support, custom
|
||||
development, application development assistance should be directed tohttp://www.rtems.com.
|
||||
|
||||
.. COMMENT: This prevents a black box from being printed on "overflow" lines.
|
||||
|
||||
.. COMMENT: The alternative is to rework a sentence to avoid this problem.
|
||||
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
|
||||
.. toctree::
|
||||
|
||||
preface
|
||||
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 3
|
||||
:numbered:
|
||||
|
||||
process_creation_and_execution
|
||||
signal
|
||||
process_environment
|
||||
files_and_directory
|
||||
input_and_output
|
||||
device_and_class_specific
|
||||
language_specific_services
|
||||
system_database
|
||||
semaphore
|
||||
mutex
|
||||
condition_variable
|
||||
memory_managment
|
||||
scheduler
|
||||
clock
|
||||
timer
|
||||
message_passing
|
||||
thread
|
||||
key
|
||||
thread_cancellation
|
||||
services_provided_by_c
|
||||
services_provided_by_math
|
||||
status_of_implementation
|
||||
command
|
||||
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`search`
|
||||
|
972
posix_users/input_and_output.rst
Normal file
972
posix_users/input_and_output.rst
Normal file
@ -0,0 +1,972 @@
|
||||
Input and Output Primitives Manager
|
||||
###################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The input and output primitives manager is ...
|
||||
|
||||
The directives provided by the input and output primitives manager are:
|
||||
|
||||
- ``pipe`` - Create an Inter-Process Channel
|
||||
|
||||
- ``dup`` - Duplicates an open file descriptor
|
||||
|
||||
- ``dup2`` - Duplicates an open file descriptor
|
||||
|
||||
- ``close`` - Closes a file
|
||||
|
||||
- ``read`` - Reads from a file
|
||||
|
||||
- ``write`` - Writes to a file
|
||||
|
||||
- ``fcntl`` - Manipulates an open file descriptor
|
||||
|
||||
- ``lseek`` - Reposition read/write file offset
|
||||
|
||||
- ``fsync`` - Synchronize file complete in-core state with that on disk
|
||||
|
||||
- ``fdatasync`` - Synchronize file in-core data with that on disk
|
||||
|
||||
- ``sync`` - Schedule file system updates
|
||||
|
||||
- ``mount`` - Mount a file system
|
||||
|
||||
- ``unmount`` - Unmount file systems
|
||||
|
||||
- ``readv`` - Vectored read from a file
|
||||
|
||||
- ``writev`` - Vectored write to a file
|
||||
|
||||
- ``aio_read`` - Asynchronous Read
|
||||
|
||||
- ``aio_write`` - Asynchronous Write
|
||||
|
||||
- ``lio_listio`` - List Directed I/O
|
||||
|
||||
- ``aio_error`` - Retrieve Error Status of Asynchronous I/O Operation
|
||||
|
||||
- ``aio_return`` - Retrieve Return Status Asynchronous I/O Operation
|
||||
|
||||
- ``aio_cancel`` - Cancel Asynchronous I/O Request
|
||||
|
||||
- ``aio_suspend`` - Wait for Asynchronous I/O Request
|
||||
|
||||
- ``aio_fsync`` - Asynchronous File Synchronization
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the input and output primitives manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
pipe - Create an Inter-Process Channel
|
||||
--------------------------------------
|
||||
.. index:: pipe
|
||||
.. index:: create an inter
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pipe(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
dup - Duplicates an open file descriptor
|
||||
----------------------------------------
|
||||
.. index:: dup
|
||||
.. index:: duplicates an open file descriptor
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
int dup(
|
||||
int fildes
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor.
|
||||
|
||||
*EINTR*
|
||||
Function was interrupted by a signal.
|
||||
|
||||
*EMFILE*
|
||||
The process already has the maximum number of file descriptors open
|
||||
and tried to open a new one.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``dup`` function returns the lowest numbered available file
|
||||
descriptor. This new desciptor refers to the same open file as the
|
||||
original descriptor and shares any locks.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
dup2 - Duplicates an open file descriptor
|
||||
-----------------------------------------
|
||||
.. index:: dup2
|
||||
.. index:: duplicates an open file descriptor
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
int dup2(
|
||||
int fildes,
|
||||
int fildes2
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor.
|
||||
|
||||
*EINTR*
|
||||
Function was interrupted by a signal.
|
||||
|
||||
*EMFILE*
|
||||
The process already has the maximum number of file descriptors open
|
||||
and tried to open a new one.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``dup2`` creates a copy of the file descriptor ``oldfd``.
|
||||
|
||||
The old and new descriptors may be used interchangeably. They share locks, file
|
||||
position pointers and flags; for example, if the file position is modified by using``lseek`` on one of the descriptors, the position is also changed for the other.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
close - Closes a file
|
||||
---------------------
|
||||
.. index:: close
|
||||
.. index:: closes a file.
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
int close(
|
||||
int fildes
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*EINTR*
|
||||
Function was interrupted by a signal.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``close()`` function deallocates the file descriptor named by``fildes`` and makes it available for reuse. All outstanding
|
||||
record locks owned by this process for the file are unlocked.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
A signal can interrupt the ``close()`` function. In that case,``close()`` returns -1 with ``errno`` set to EINTR. The file
|
||||
may or may not be closed.
|
||||
|
||||
read - Reads from a file
|
||||
------------------------
|
||||
.. index:: read
|
||||
.. index:: reads from a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
int read(
|
||||
int fildes,
|
||||
void \*buf,
|
||||
unsigned int nbyte
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets ``errno`` to one of
|
||||
the following:
|
||||
|
||||
*EAGAIN*
|
||||
The O_NONBLOCK flag is set for a file descriptor and the process
|
||||
would be delayed in the I/O operation.
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*EINTR*
|
||||
Function was interrupted by a signal.
|
||||
|
||||
*EIO*
|
||||
Input or output error
|
||||
|
||||
*EINVAL*
|
||||
Bad buffer pointer
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``read()`` function reads ``nbyte`` bytes from the file
|
||||
associated with ``fildes`` into the buffer pointed to by ``buf``.
|
||||
|
||||
The ``read()`` function returns the number of bytes actually read
|
||||
and placed in the buffer. This will be less than ``nbyte`` if:
|
||||
|
||||
- The number of bytes left in the file is less than ``nbyte``.
|
||||
|
||||
- The ``read()`` request was interrupted by a signal.
|
||||
|
||||
- The file is a pipe or FIFO or special file with less than ``nbytes``
|
||||
immediately available for reading.
|
||||
|
||||
When attempting to read from any empty pipe or FIFO:
|
||||
|
||||
- If no process has the pipe open for writing, zero is returned to
|
||||
indicate end-of-file.
|
||||
|
||||
- If some process has the pipe open for writing and O_NONBLOCK is set,
|
||||
-1 is returned and ``errno`` is set to EAGAIN.
|
||||
|
||||
- If some process has the pipe open for writing and O_NONBLOCK is clear,``read()`` waits for some data to be written or the pipe to be closed.
|
||||
|
||||
When attempting to read from a file other than a pipe or FIFO and no data
|
||||
is available.
|
||||
|
||||
- If O_NONBLOCK is set, -1 is returned and ``errno`` is set to EAGAIN.
|
||||
|
||||
- If O_NONBLOCK is clear, ``read()`` waits for some data to become
|
||||
available.
|
||||
|
||||
- The O_NONBLOCK flag is ignored if data is available.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
write - Writes to a file
|
||||
------------------------
|
||||
.. index:: write
|
||||
.. index:: writes to a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
int write(
|
||||
int fildes,
|
||||
const void \*buf,
|
||||
unsigned int nbytes
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EAGAIN*
|
||||
The O_NONBLOCK flag is set for a file descriptor and the process
|
||||
would be delayed in the I/O operation.
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*EFBIG*
|
||||
An attempt was made to write to a file that exceeds the maximum file
|
||||
size
|
||||
|
||||
*EINTR*
|
||||
The function was interrupted by a signal.
|
||||
|
||||
*EIO*
|
||||
Input or output error.
|
||||
|
||||
*ENOSPC*
|
||||
No space left on disk.
|
||||
|
||||
*EPIPE*
|
||||
Attempt to write to a pope or FIFO with no reader.
|
||||
|
||||
*EINVAL*
|
||||
Bad buffer pointer
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``write()`` function writes ``nbyte`` from the array pointed
|
||||
to by ``buf`` into the file associated with ``fildes``.
|
||||
|
||||
If ``nybte`` is zero and the file is a regular file, the ``write()``
|
||||
function returns zero and has no other effect. If ``nbyte`` is zero
|
||||
and the file is a special file, te results are not portable.
|
||||
|
||||
The ``write()`` function returns the number of bytes written. This
|
||||
number will be less than ``nbytes`` if there is an error. It will never
|
||||
be greater than ``nbytes``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
fcntl - Manipulates an open file descriptor
|
||||
-------------------------------------------
|
||||
.. index:: fcntl
|
||||
.. index:: manipulates an open file descriptor
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
int fcntl(
|
||||
int fildes,
|
||||
int cmd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EACCESS*
|
||||
Search permission is denied for a direcotry in a file’s path
|
||||
prefix.
|
||||
|
||||
*EAGAIN*
|
||||
The O_NONBLOCK flag is set for a file descriptor and the process
|
||||
would be delayed in the I/O operation.
|
||||
|
||||
*EBADF*
|
||||
Invalid file descriptor
|
||||
|
||||
*EDEADLK*
|
||||
An ``fcntl`` with function F_SETLKW would cause a deadlock.
|
||||
|
||||
*EINTR*
|
||||
The functioin was interrupted by a signal.
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument
|
||||
|
||||
*EMFILE*
|
||||
Too many file descriptor or in use by the process.
|
||||
|
||||
*ENOLCK*
|
||||
No locks available
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``fcntl()`` performs one of various miscellaneous operations on``fd``. The operation in question is determined by ``cmd``:
|
||||
|
||||
*F_DUPFD*
|
||||
Makes ``arg`` be a copy of ``fd``, closing ``fd`` first if necessary.
|
||||
The same functionality can be more easily achieved by using ``dup2()``.
|
||||
The old and new descriptors may be used interchangeably. They share locks,
|
||||
file position pointers and flags; for example, if the file position is
|
||||
modified by using ``lseek()`` on one of the descriptors, the position is
|
||||
also changed for the other.
|
||||
The two descriptors do not share the close-on-exec flag, however. The
|
||||
close-on-exec flag of the copy is off, meaning that it will be closed on
|
||||
exec.
|
||||
On success, the new descriptor is returned.
|
||||
|
||||
*F_GETFD*
|
||||
Read the close-on-exec flag. If the low-order bit is 0, the file will
|
||||
remain open across exec, otherwise it will be closed.
|
||||
|
||||
*F_SETFD*
|
||||
Set the close-on-exec flag to the value specified by ``arg`` (only the least
|
||||
significant bit is used).
|
||||
|
||||
*F_GETFL*
|
||||
Read the descriptor’s flags (all flags (as set by open()) are returned).
|
||||
|
||||
*F_SETFL*
|
||||
Set the descriptor’s flags to the value specified by ``arg``. Only``O_APPEND`` and ``O_NONBLOCK`` may be set.
|
||||
The flags are shared between copies (made with ``dup()`` etc.) of the same
|
||||
file descriptor.
|
||||
The flags and their semantics are described in ``open()``.
|
||||
|
||||
*F_GETLK, F_SETLK and F_SETLKW*
|
||||
Manage discretionary file locks. The third argument ``arg`` is a pointer to a
|
||||
struct flock (that may be overwritten by this call).
|
||||
|
||||
*F_GETLK*
|
||||
Return the flock structure that prevents us from obtaining the lock, or set the``l_type`` field of the lock to ``F_UNLCK`` if there is no obstruction.
|
||||
|
||||
*F_SETLK*
|
||||
The lock is set (when ``l_type`` is ``F_RDLCK`` or ``F_WRLCK``) or
|
||||
cleared (when it is ``F_UNLCK``. If lock is held by someone else, this
|
||||
call returns -1 and sets ``errno`` to EACCES or EAGAIN.
|
||||
|
||||
*F_SETLKW*
|
||||
Like ``F_SETLK``, but instead of returning an error we wait for the lock to
|
||||
be released.
|
||||
|
||||
*F_GETOWN*
|
||||
Get the process ID (or process group) of the owner of a socket.
|
||||
Process groups are returned as negative values.
|
||||
|
||||
*F_SETOWN*
|
||||
Set the process or process group that owns a socket.
|
||||
For these commands, ownership means receiving ``SIGIO`` or ``SIGURG``
|
||||
signals.
|
||||
Process groups are specified using negative values.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The errors returned by ``dup2`` are different from those returned by``F_DUPFD``.
|
||||
|
||||
lseek - Reposition read/write file offset
|
||||
-----------------------------------------
|
||||
.. index:: lseek
|
||||
.. index:: reposition read/write file offset
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
int lseek(
|
||||
int fildes,
|
||||
off_t offset,
|
||||
int whence
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EBADF*
|
||||
``fildes`` is not an open file descriptor.
|
||||
|
||||
*ESPIPE*
|
||||
``fildes`` is associated with a pipe, socket or FIFO.
|
||||
|
||||
*EINVAL*
|
||||
``whence`` is not a proper value.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``lseek`` function repositions the offset of the file descriptor``fildes`` to the argument offset according to the directive whence.
|
||||
The argument ``fildes`` must be an open file descriptor. ``Lseek``
|
||||
repositions the file pointer fildes as follows:
|
||||
|
||||
- If ``whence`` is SEEK_SET, the offset is set to ``offset`` bytes.
|
||||
|
||||
- If ``whence`` is SEEK_CUR, the offset is set to its current location
|
||||
plus offset bytes.
|
||||
|
||||
- If ``whence`` is SEEK_END, the offset is set to the size of the
|
||||
file plus ``offset`` bytes.
|
||||
|
||||
The ``lseek`` function allows the file offset to be set beyond the end
|
||||
of the existing end-of-file of the file. If data is later written at this
|
||||
point, subsequent reads of the data in the gap return bytes of zeros
|
||||
(until data is actually written into the gap).
|
||||
|
||||
Some devices are incapable of seeking. The value of the pointer associated
|
||||
with such a device is undefined.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
fsync - Synchronize file complete in-core state with that on disk
|
||||
-----------------------------------------------------------------
|
||||
.. index:: fsync
|
||||
.. index:: synchronize file complete in
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int fsync(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On success, zero is returned. On error, -1 is returned, and ``errno``
|
||||
is set appropriately.
|
||||
|
||||
*EBADF*
|
||||
``fd`` is not a valid descriptor open for writing
|
||||
|
||||
*EINVAL*
|
||||
``fd`` is bound to a special file which does not support support synchronization
|
||||
|
||||
*EROFS*
|
||||
``fd`` is bound to a special file which does not support support synchronization
|
||||
|
||||
*EIO*
|
||||
An error occurred during synchronization
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``fsync`` copies all in-core parts of a file to disk.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
fdatasync - Synchronize file in-core data with that on disk
|
||||
-----------------------------------------------------------
|
||||
.. index:: fdatasync
|
||||
.. index:: synchronize file in
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int fdatasync(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On success, zero is returned. On error, -1 is returned, and ``errno`` is
|
||||
set appropriately.
|
||||
|
||||
*EBADF*
|
||||
``fd`` is not a valid file descriptor open for writing.
|
||||
|
||||
*EINVAL*
|
||||
``fd`` is bound to a special file which does not support synchronization.
|
||||
|
||||
*EIO*
|
||||
An error occurred during synchronization.
|
||||
|
||||
*EROFS*
|
||||
``fd`` is bound to a special file which dows not support synchronization.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``fdatasync`` flushes all data buffers of a file to disk (before the system call
|
||||
returns). It resembles ``fsync`` but is not required to update the metadata such
|
||||
as access time.
|
||||
|
||||
Applications that access databases or log files often write a tiny data fragment
|
||||
(e.g., one line in a log file) and then call ``fsync`` immediately in order to
|
||||
ensure that the written data is physically stored on the harddisk. Unfortunately,
|
||||
fsync will always initiate two write operations: one for the newly written data and
|
||||
another one in order to update the modification time stored in the inode. If the
|
||||
modification time is not a part of the transaction concept ``fdatasync`` can be
|
||||
used to avoid unnecessary inode disk write operations.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
sync - Schedule file system updates
|
||||
-----------------------------------
|
||||
.. index:: sync
|
||||
.. index:: synchronize file systems
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
void sync(void);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
NONE
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``sync`` service causes all information in memory that updates
|
||||
file systems to be scheduled for writing out to all file systems.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The writing of data to the file systems is only guaranteed to be
|
||||
scheduled upon return. It is not necessarily complete upon return
|
||||
from ``sync``.
|
||||
|
||||
mount - Mount a file system
|
||||
---------------------------
|
||||
.. index:: mount
|
||||
.. index:: mount a file system
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <libio.h>
|
||||
int mount(
|
||||
rtems_filesystem_mount_table_entry_t \**mt_entry,
|
||||
rtems_filesystem_operations_table \*fs_ops,
|
||||
rtems_filesystem_options_t fsoptions,
|
||||
char \*device,
|
||||
char \*mount_point
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EXXX*
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``mount`` routines mounts the filesystem class
|
||||
which uses the filesystem operations specified by ``fs_ops``
|
||||
and ``fsoptions``. The filesystem is mounted at the directory``mount_point`` and the mode of the mounted filesystem is
|
||||
specified by ``fsoptions``. If this filesystem class requires
|
||||
a device, then the name of the device must be specified by ``device``.
|
||||
|
||||
If this operation succeeds, the mount table entry for the mounted
|
||||
filesystem is returned in ``mt_entry``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
unmount - Unmount file systems
|
||||
------------------------------
|
||||
.. index:: unmount
|
||||
.. index:: unmount file systems
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <libio.h>
|
||||
int unmount(
|
||||
const char \*mount_path
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EXXX*
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``unmount`` routine removes the attachment of the filesystem specified
|
||||
by ``mount_path``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
readv - Vectored read from a file
|
||||
---------------------------------
|
||||
.. index:: readv
|
||||
.. index:: vectored read from a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/uio.h>
|
||||
ssize_t readv(
|
||||
int fd,
|
||||
const struct iovec \*iov,
|
||||
int iovcnt
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
In addition to the errors detected by``Input and Output Primitives Manager read - Reads from a file, read()``,
|
||||
this routine may return -1 and sets ``errno`` based upon the following
|
||||
errors:
|
||||
|
||||
*EINVAL*
|
||||
The sum of the ``iov_len`` values in the iov array overflowed an``ssize_t``.
|
||||
|
||||
*EINVAL*
|
||||
The ``iovcnt`` argument was less than or equal to 0, or greater
|
||||
than ``IOV_MAX``.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``readv()`` function is equivalent to ``read()``
|
||||
except as described here. The ``readv()`` function shall place
|
||||
the input data into the ``iovcnt`` buffers specified by the
|
||||
members of the ``iov`` array: ``iov[0], iov[1], ..., iov[iovcnt-1]``.
|
||||
|
||||
Each ``iovec`` entry specifies the base address and length of an area
|
||||
in memory where data should be placed. The ``readv()`` function
|
||||
always fills an area completely before proceeding to the next.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
writev - Vectored write to a file
|
||||
---------------------------------
|
||||
.. index:: writev
|
||||
.. index:: vectored write to a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/uio.h>
|
||||
ssize_t writev(
|
||||
int fd,
|
||||
const struct iovec \*iov,
|
||||
int iovcnt
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
In addition to the errors detected by``Input and Output Primitives Manager write - Write to a file, write()``,
|
||||
this routine may return -1 and sets ``errno`` based upon the following
|
||||
errors:
|
||||
|
||||
*EINVAL*
|
||||
The sum of the ``iov_len`` values in the iov array overflowed an``ssize_t``.
|
||||
|
||||
*EINVAL*
|
||||
The ``iovcnt`` argument was less than or equal to 0, or greater
|
||||
than ``IOV_MAX``.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``writev()`` function is equivalent to ``write()``,
|
||||
except as noted here. The ``writev()`` function gathers output
|
||||
data from the ``iovcnt`` buffers specified by the members of
|
||||
the ``iov array``: ``iov[0], iov[1], ..., iov[iovcnt-1]``.
|
||||
The ``iovcnt`` argument is valid if greater than 0 and less
|
||||
than or equal to ``IOV_MAX``.
|
||||
|
||||
Each ``iovec`` entry specifies the base address and length of
|
||||
an area in memory from which data should be written. The ``writev()``
|
||||
function always writes a complete area before proceeding to the next.
|
||||
|
||||
If ``fd`` refers to a regular file and all of the ``iov_len``
|
||||
members in the array pointed to by ``iov`` are 0, ``writev()``
|
||||
returns 0 and has no other effect. For other file types, the behavior
|
||||
is unspecified by POSIX.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
aio_read - Asynchronous Read
|
||||
----------------------------
|
||||
.. index:: aio_read
|
||||
.. index:: asynchronous read
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_read(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_write - Asynchronous Write
|
||||
------------------------------
|
||||
.. index:: aio_write
|
||||
.. index:: asynchronous write
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_write(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
lio_listio - List Directed I/O
|
||||
------------------------------
|
||||
.. index:: lio_listio
|
||||
.. index:: list directed i/o
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int lio_listio(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_error - Retrieve Error Status of Asynchronous I/O Operation
|
||||
---------------------------------------------------------------
|
||||
.. index:: aio_error
|
||||
.. index:: retrieve error status of asynchronous i/o operation
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_error(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_return - Retrieve Return Status Asynchronous I/O Operation
|
||||
--------------------------------------------------------------
|
||||
.. index:: aio_return
|
||||
.. index:: retrieve return status asynchronous i/o operation
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_return(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_cancel - Cancel Asynchronous I/O Request
|
||||
--------------------------------------------
|
||||
.. index:: aio_cancel
|
||||
.. index:: cancel asynchronous i/o request
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_cancel(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_suspend - Wait for Asynchronous I/O Request
|
||||
-----------------------------------------------
|
||||
.. index:: aio_suspend
|
||||
.. index:: wait for asynchronous i/o request
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_suspend(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
aio_fsync - Asynchronous File Synchronization
|
||||
---------------------------------------------
|
||||
.. index:: aio_fsync
|
||||
.. index:: asynchronous file synchronization
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int aio_fsync(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not currently supported by RTEMS but could be
|
||||
in a future version.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
195
posix_users/key.rst
Normal file
195
posix_users/key.rst
Normal file
@ -0,0 +1,195 @@
|
||||
Key Manager
|
||||
###########
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The key manager allows for the creation and deletion of Data keys
|
||||
specific to threads.
|
||||
|
||||
The directives provided by the key manager are:
|
||||
|
||||
- ``pthread_key_create`` - Create Thread Specific Data Key
|
||||
|
||||
- ``pthread_key_delete`` - Delete Thread Specific Data Key
|
||||
|
||||
- ``pthread_setspecific`` - Set Thread Specific Key Value
|
||||
|
||||
- ``pthread_getspecific`` - Get Thread Specific Key Value
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the key manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
pthread_key_create - Create Thread Specific Data Key
|
||||
----------------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_key_create(
|
||||
pthread_key_t \*key,
|
||||
void (\*destructor)( void )
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EAGAIN*
|
||||
There were not enough resources available to create another key.
|
||||
|
||||
*ENOMEM*
|
||||
Insufficient memory exists to create the key.
|
||||
|
||||
**DESCRIPTION**
|
||||
|
||||
The pthread_key_create() function shall create a thread-specific data
|
||||
key visible to all threads in the process. Key values provided by
|
||||
pthread_key_create() are opaque objects used to locate thread-specific
|
||||
data. Although the same key value may be used by different threads, the
|
||||
values bound to the key by pthread_setspecific() are maintained on a
|
||||
per-thread basis and persist for the life of the calling thread.
|
||||
|
||||
Upon key creation, the value NULL shall be associated with the new key
|
||||
in all active threads. Upon thread creation, the value NULL shall be
|
||||
associated with all defined keys in the new thread.
|
||||
|
||||
**NOTES**
|
||||
|
||||
An optional destructor function may be associated with each key value.
|
||||
At thread exit, if a key value has a non-NULL destructor pointer, and
|
||||
the thread has a non-NULL value associated with that key, the value of
|
||||
the key is set to NULL, and then the function pointed to is called with
|
||||
the previously associated value as its sole argument. The order of
|
||||
destructor calls is unspecified if more than one destructor exists for
|
||||
a thread when it exits.
|
||||
|
||||
pthread_key_delete - Delete Thread Specific Data Key
|
||||
----------------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_key_delete(
|
||||
pthread_key_t key);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The key was invalid
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The pthread_key_delete() function shall delete a thread-specific data key
|
||||
previously returned by pthread_key_create(). The thread-specific data
|
||||
values associated with key need not be NULL at the time pthread_key_delete()
|
||||
is called. It is the responsibility of the application to free any
|
||||
application storage or perform any cleanup actions for data structures related
|
||||
to the deleted key or associated thread-specific data in any
|
||||
threads; this cleanup can be done either before or after
|
||||
pthread_key_delete() is called. Any attempt to use key following the call to
|
||||
pthread_key_delete() results in undefined behavior.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The pthread_key_delete() function shall be callable from within
|
||||
destructor functions. No destructor functions shall be invoked by
|
||||
pthread_key_delete(). Any destructor function that may have been
|
||||
associated with key shall no longer be called upon thread exit.
|
||||
|
||||
pthread_setspecific - Set Thread Specific Key Value
|
||||
---------------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_setspecific(
|
||||
pthread_key_t key,
|
||||
const void \*value
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified key is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The pthread_setspecific() function shall associate a thread-specific value
|
||||
with a key obtained via a previous call to pthread_key_create().
|
||||
Different threads may bind different values to the same key. These values
|
||||
are typically pointers to blocks of dynamically allocated memory that
|
||||
have been reserved for use by the calling thread.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The effect of calling pthread_setspecific() with a key value not obtained
|
||||
from pthread_key_create() or after key has
|
||||
been deleted with pthread_key_delete() is undefined.
|
||||
|
||||
pthread_setspecific() may be called from a thread-specific data
|
||||
destructor function. Calling pthread_setspecific() from a thread-specific
|
||||
data destructor routine may result either in lost storage (after at least
|
||||
PTHREAD_DESTRUCTOR_ITERATIONS attempts at destruction) or in an infinite loop.
|
||||
|
||||
pthread_getspecific - Get Thread Specific Key Value
|
||||
---------------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
void \*pthread_getspecific(
|
||||
pthread_key_t key
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*NULL*
|
||||
There is no thread-specific data associated with the specified key.
|
||||
|
||||
*non-NULL*
|
||||
The data associated with the specified key.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The pthread_getspecific() function shall return the value currently bound to
|
||||
the specified key on behalf of the calling thread.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The effect of calling pthread_getspecific() with a key value not obtained from
|
||||
pthread_key_create() or after key has
|
||||
been deleted with pthread_key_delete() is undefined.
|
||||
|
||||
pthread_getspecific() may be called from a thread-specific data destructor
|
||||
function. A call to pthread_getspecific() for the thread-specific data key
|
||||
being destroyed shall return the value NULL, unless the value is changed
|
||||
(after the destructor starts) by a call to pthread_setspecific().
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
518
posix_users/language_specific_services.rst
Normal file
518
posix_users/language_specific_services.rst
Normal file
@ -0,0 +1,518 @@
|
||||
Language-Specific Services for the C Programming Language Manager
|
||||
#################################################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The
|
||||
language-specific services for the C programming language manager is ...
|
||||
|
||||
The directives provided by the language-specific services for the C programming language manager are:
|
||||
|
||||
- ``setlocale`` - Set the Current Locale
|
||||
|
||||
- ``fileno`` - Obtain File Descriptor Number for this File
|
||||
|
||||
- ``fdopen`` - Associate Stream with File Descriptor
|
||||
|
||||
- ``flockfile`` - Acquire Ownership of File Stream
|
||||
|
||||
- ``ftrylockfile`` - Poll to Acquire Ownership of File Stream
|
||||
|
||||
- ``funlockfile`` - Release Ownership of File Stream
|
||||
|
||||
- ``getc_unlocked`` - Get Character without Locking
|
||||
|
||||
- ``getchar_unlocked`` - Get Character from stdin without Locking
|
||||
|
||||
- ``putc_unlocked`` - Put Character without Locking
|
||||
|
||||
- ``putchar_unlocked`` - Put Character to stdin without Locking
|
||||
|
||||
- ``setjmp`` - Save Context for Non-Local Goto
|
||||
|
||||
- ``longjmp`` - Non-Local Jump to a Saved Context
|
||||
|
||||
- ``sigsetjmp`` - Save Context with Signal Status for Non-Local Goto
|
||||
|
||||
- ``siglongjmp`` - Non-Local Jump with Signal Status to a Saved Context
|
||||
|
||||
- ``tzset`` - Initialize Time Conversion Information
|
||||
|
||||
- ``strtok_r`` - Reentrant Extract Token from String
|
||||
|
||||
- ``asctime_r`` - Reentrant struct tm to ASCII Time Conversion
|
||||
|
||||
- ``ctime_r`` - Reentrant time_t to ASCII Time Conversion
|
||||
|
||||
- ``gmtime_r`` - Reentrant UTC Time Conversion
|
||||
|
||||
- ``localtime_r`` - Reentrant Local Time Conversion
|
||||
|
||||
- ``rand_r`` - Reentrant Random Number Generation
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the language-specific services for the C programming language manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
setlocale - Set the Current Locale
|
||||
----------------------------------
|
||||
.. index:: setlocale
|
||||
.. index:: set the current locale
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setlocale(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
fileno - Obtain File Descriptor Number for this File
|
||||
----------------------------------------------------
|
||||
.. index:: fileno
|
||||
.. index:: obtain file descriptor number for this file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int fileno(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
fdopen - Associate Stream with File Descriptor
|
||||
----------------------------------------------
|
||||
.. index:: fdopen
|
||||
.. index:: associate stream with file descriptor
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int fdopen(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
flockfile - Acquire Ownership of File Stream
|
||||
--------------------------------------------
|
||||
.. index:: flockfile
|
||||
.. index:: acquire ownership of file stream
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int flockfile(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
ftrylockfile - Poll to Acquire Ownership of File Stream
|
||||
-------------------------------------------------------
|
||||
.. index:: ftrylockfile
|
||||
.. index:: poll to acquire ownership of file stream
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int ftrylockfile(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
funlockfile - Release Ownership of File Stream
|
||||
----------------------------------------------
|
||||
.. index:: funlockfile
|
||||
.. index:: release ownership of file stream
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int funlockfile(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getc_unlocked - Get Character without Locking
|
||||
---------------------------------------------
|
||||
.. index:: getc_unlocked
|
||||
.. index:: get character without locking
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getc_unlocked(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getchar_unlocked - Get Character from stdin without Locking
|
||||
-----------------------------------------------------------
|
||||
.. index:: getchar_unlocked
|
||||
.. index:: get character from stdin without locking
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getchar_unlocked(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
putc_unlocked - Put Character without Locking
|
||||
---------------------------------------------
|
||||
.. index:: putc_unlocked
|
||||
.. index:: put character without locking
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int putc_unlocked(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
putchar_unlocked - Put Character to stdin without Locking
|
||||
---------------------------------------------------------
|
||||
.. index:: putchar_unlocked
|
||||
.. index:: put character to stdin without locking
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int putchar_unlocked(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
setjmp - Save Context for Non-Local Goto
|
||||
----------------------------------------
|
||||
.. index:: setjmp
|
||||
.. index:: save context for non
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setjmp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
longjmp - Non-Local Jump to a Saved Context
|
||||
-------------------------------------------
|
||||
.. index:: longjmp
|
||||
.. index:: non
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int longjmp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
sigsetjmp - Save Context with Signal Status for Non-Local Goto
|
||||
--------------------------------------------------------------
|
||||
.. index:: sigsetjmp
|
||||
.. index:: save context with signal status for non
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sigsetjmp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
siglongjmp - Non-Local Jump with Signal Status to a Saved Context
|
||||
-----------------------------------------------------------------
|
||||
.. index:: siglongjmp
|
||||
.. index:: non
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int siglongjmp(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
tzset - Initialize Time Conversion Information
|
||||
----------------------------------------------
|
||||
.. index:: tzset
|
||||
.. index:: initialize time conversion information
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int tzset(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
strtok_r - Reentrant Extract Token from String
|
||||
----------------------------------------------
|
||||
.. index:: strtok_r
|
||||
.. index:: reentrant extract token from string
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int strtok_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
asctime_r - Reentrant struct tm to ASCII Time Conversion
|
||||
--------------------------------------------------------
|
||||
.. index:: asctime_r
|
||||
.. index:: reentrant struct tm to ascii time conversion
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int asctime_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
ctime_r - Reentrant time_t to ASCII Time Conversion
|
||||
---------------------------------------------------
|
||||
.. index:: ctime_r
|
||||
.. index:: reentrant time_t to ascii time conversion
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int ctime_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
gmtime_r - Reentrant UTC Time Conversion
|
||||
----------------------------------------
|
||||
.. index:: gmtime_r
|
||||
.. index:: reentrant utc time conversion
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int gmtime_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
localtime_r - Reentrant Local Time Conversion
|
||||
---------------------------------------------
|
||||
.. index:: localtime_r
|
||||
.. index:: reentrant local time conversion
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int localtime_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
rand_r - Reentrant Random Number Generation
|
||||
-------------------------------------------
|
||||
.. index:: rand_r
|
||||
.. index:: reentrant random number generation
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int rand_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
265
posix_users/memory_managment.rst
Normal file
265
posix_users/memory_managment.rst
Normal file
@ -0,0 +1,265 @@
|
||||
Memory Management Manager
|
||||
#########################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The
|
||||
memory management manager is ...
|
||||
|
||||
The directives provided by the memory management manager are:
|
||||
|
||||
- ``mlockall`` - Lock the Address Space of a Process
|
||||
|
||||
- ``munlockall`` - Unlock the Address Space of a Process
|
||||
|
||||
- ``mlock`` - Lock a Range of the Process Address Space
|
||||
|
||||
- ``munlock`` - Unlock a Range of the Process Address Space
|
||||
|
||||
- ``mmap`` - Map Process Addresses to a Memory Object
|
||||
|
||||
- ``munmap`` - Unmap Previously Mapped Addresses
|
||||
|
||||
- ``mprotect`` - Change Memory Protection
|
||||
|
||||
- ``msync`` - Memory Object Synchronization
|
||||
|
||||
- ``shm_open`` - Open a Shared Memory Object
|
||||
|
||||
- ``shm_unlink`` - Remove a Shared Memory Object
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the memory management manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
mlockall - Lock the Address Space of a Process
|
||||
----------------------------------------------
|
||||
.. index:: mlockall
|
||||
.. index:: lock the address space of a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int mlockall(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
munlockall - Unlock the Address Space of a Process
|
||||
--------------------------------------------------
|
||||
.. index:: munlockall
|
||||
.. index:: unlock the address space of a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int munlockall(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
mlock - Lock a Range of the Process Address Space
|
||||
-------------------------------------------------
|
||||
.. index:: mlock
|
||||
.. index:: lock a range of the process address space
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int mlock(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
munlock - Unlock a Range of the Process Address Space
|
||||
-----------------------------------------------------
|
||||
.. index:: munlock
|
||||
.. index:: unlock a range of the process address space
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int munlock(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
mmap - Map Process Addresses to a Memory Object
|
||||
-----------------------------------------------
|
||||
.. index:: mmap
|
||||
.. index:: map process addresses to a memory object
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int mmap(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
munmap - Unmap Previously Mapped Addresses
|
||||
------------------------------------------
|
||||
.. index:: munmap
|
||||
.. index:: unmap previously mapped addresses
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int munmap(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
mprotect - Change Memory Protection
|
||||
-----------------------------------
|
||||
.. index:: mprotect
|
||||
.. index:: change memory protection
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int mprotect(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
msync - Memory Object Synchronization
|
||||
-------------------------------------
|
||||
.. index:: msync
|
||||
.. index:: memory object synchronization
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int msync(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
shm_open - Open a Shared Memory Object
|
||||
--------------------------------------
|
||||
.. index:: shm_open
|
||||
.. index:: open a shared memory object
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int shm_open(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
shm_unlink - Remove a Shared Memory Object
|
||||
------------------------------------------
|
||||
.. index:: shm_unlink
|
||||
.. index:: remove a shared memory object
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int shm_unlink(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
665
posix_users/message_passing.rst
Normal file
665
posix_users/message_passing.rst
Normal file
@ -0,0 +1,665 @@
|
||||
Message Passing Manager
|
||||
#######################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The message passing manager is the means to provide communication and
|
||||
synchronization capabilities using POSIX message queues.
|
||||
|
||||
The directives provided by the message passing manager are:
|
||||
|
||||
- ``mq_open`` - Open a Message Queue
|
||||
|
||||
- ``mq_close`` - Close a Message Queue
|
||||
|
||||
- ``mq_unlink`` - Remove a Message Queue
|
||||
|
||||
- ``mq_send`` - Send a Message to a Message Queue
|
||||
|
||||
- ``mq_receive`` - Receive a Message from a Message Queue
|
||||
|
||||
- ``mq_notify`` - Notify Process that a Message is Available
|
||||
|
||||
- ``mq_setattr`` - Set Message Queue Attributes
|
||||
|
||||
- ``mq_getattr`` - Get Message Queue Attributes
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Theory
|
||||
------
|
||||
|
||||
Message queues are named objects that operate with readers and writers.
|
||||
In addition, a message queue is a priority queue of discrete messages.
|
||||
POSIX message queues offer a certain, basic amount of application access
|
||||
to, and control over, the message queue geometry that can be changed.
|
||||
|
||||
Messages
|
||||
--------
|
||||
|
||||
A message is a variable length buffer where information can be stored to
|
||||
support communication. The length of the message and the information
|
||||
stored in that message are user-defined and can be actual data,
|
||||
pointer(s), or empty. There is a maximum acceptable length for a message
|
||||
that is associated with each message queue.
|
||||
|
||||
Message Queues
|
||||
--------------
|
||||
|
||||
Message queues are named objects similar to the pipes of POSIX. They are
|
||||
a means of communicating data between multiple processes and for passing
|
||||
messages among tasks and ISRs. Message queues can contain a variable
|
||||
number of messages from 0 to an upper limit that is user defined. The
|
||||
maximum length of the message can be set on a per message queue basis.
|
||||
Normally messages are sent and received from the message queue in FIFO
|
||||
order. However, messages can also be prioritized and a priority queue
|
||||
established for the passing of messages. Synchronization is needed when a
|
||||
task waits for a message to arrive at a queue. Also, a task may poll a
|
||||
queue for the arrival of a message... index:: mqd_t
|
||||
|
||||
The message queue descriptor ``mqd_t`` represents the message queue. It is
|
||||
passed as an argument to all of the message queue functions.
|
||||
|
||||
Building a Message Queue Attribute Set
|
||||
--------------------------------------
|
||||
|
||||
The mq_attr structure is used to define the characteristics of the message
|
||||
queue... index:: mq_attr
|
||||
|
||||
.. code:: c
|
||||
|
||||
typedef struct mq_attr{
|
||||
long mq_flags;
|
||||
long mq_maxmsg;
|
||||
long mq_msgsize;
|
||||
long mq_curmsgs;
|
||||
};
|
||||
|
||||
All of these attributes are set when the message queue is created using
|
||||
mq_open. The mq_flags field is not used in the creation of a message
|
||||
queue, it is only used by mq_setattr and mq_getattr. The structure
|
||||
mq_attr is passed as an argument to mq_setattr and mq_getattr.
|
||||
|
||||
The mq_flags contain information affecting the behavior of the message
|
||||
queue. The O_NONBLOCK mq_flag is the only flag that is defined. In
|
||||
mq_setattr, the mq_flag can be set to dynamically change the blocking and
|
||||
non-blocking behavior of the message queue. If the non-block flag is set
|
||||
then the message queue is non-blocking, and requests to send and receive
|
||||
messages do not block waiting for resources. For a blocking message
|
||||
queue, a request to send might have to wait for an empty message queue,
|
||||
and a request to receive might have to wait for a message to arrive on the
|
||||
queue. Both mq_maxmsg and mq_msgsize affect the sizing of the message
|
||||
queue. mq_maxmsg specifies how many messages the queue can hold at any
|
||||
one time. mq_msgsize specifies the size of any one message on the queue.
|
||||
If either of these limits is exceeded, an error message results.
|
||||
|
||||
Upon return from mq_getattr, the mq_curmsgs is set according to the
|
||||
current state of the message queue. This specifies the number of messages
|
||||
currently on the queue.
|
||||
|
||||
Notification of a Message on the Queue
|
||||
--------------------------------------
|
||||
|
||||
Every message queue has the ability to notify one (and only one) process
|
||||
whenever the queue’s state changes from empty (0 messages) to nonempty.
|
||||
This means that the process does not have to block or constantly poll
|
||||
while it waits for a message. By calling mq_notify, you can attach a
|
||||
notification request to a message queue. When a message is received by an
|
||||
empty queue, if there are no processes blocked and waiting for the
|
||||
message, then the queue notifies the requesting process of a message
|
||||
arrival. There is only one signal sent by the message queue, after that
|
||||
the notification request is de-registered and another process can attach
|
||||
its notification request. After receipt of a notification, a process must
|
||||
re-register if it wishes to be notified again.
|
||||
|
||||
If there is a process blocked and waiting for the message, that process
|
||||
gets the message, and notification is not sent. It is also possible for
|
||||
another process to receive the message after the notification is sent but
|
||||
before the notified process has sent its receive request.
|
||||
|
||||
Only one process can have a notification request attached to a message
|
||||
queue at any one time. If another process attempts to register a
|
||||
notification request, it fails. You can de-register for a message queue
|
||||
by passing a NULL to mq_notify, this removes any notification request
|
||||
attached to the queue. Whenever the message queue is closed, all
|
||||
notification attachments are removed.
|
||||
|
||||
POSIX Interpretation Issues
|
||||
---------------------------
|
||||
|
||||
There is one significant point of interpretation related to
|
||||
the RTEMS implementation of POSIX message queues:
|
||||
|
||||
*What happens to threads already blocked on a message queue when the
|
||||
mode of that same message queue is changed from blocking to non-blocking?*
|
||||
|
||||
The RTEMS POSIX implementation decided to unblock all waiting tasks
|
||||
with an ``EAGAIN`` status just as if a non-blocking version of
|
||||
the same operation had returned unsatisfied. This case is not
|
||||
discussed in the POSIX standard and other implementations may have
|
||||
chosen alternative behaviors.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
Opening or Creating a Message Queue
|
||||
-----------------------------------
|
||||
|
||||
If the message queue already exists, mq_open() opens it, if the message
|
||||
queue does not exist, mq_open() creates it. When a message queue is
|
||||
created, the geometry of the message queue is contained in the attribute
|
||||
structure that is passed in as an argument. This includes mq_msgsize that
|
||||
dictates the maximum size of a single message, and the mq_maxmsg that
|
||||
dictates the maximum number of messages the queue can hold at one time.
|
||||
The blocking or non-blocking behavior of the queue can also specified.
|
||||
|
||||
Closing a Message Queue
|
||||
-----------------------
|
||||
|
||||
The mq_close() function is used to close the connection made to a message
|
||||
queue that was made during mq_open. The message queue itself and the
|
||||
messages on the queue are persistent and remain after the queue is closed.
|
||||
|
||||
Removing a Message Queue
|
||||
------------------------
|
||||
|
||||
The mq_unlink() function removes the named message queue. If the message
|
||||
queue is not open when mq_unlink is called, then the queue is immediately
|
||||
eliminated. Any messages that were on the queue are lost, and the queue
|
||||
can not be opened again. If processes have the queue open when mq_unlink
|
||||
is called, the removal of the queue is delayed until the last process
|
||||
using the queue has finished. However, the name of the message queue is
|
||||
removed so that no other process can open it.
|
||||
|
||||
Sending a Message to a Message Queue
|
||||
------------------------------------
|
||||
|
||||
The mq_send() function adds the message in priority order to the message
|
||||
queue. Each message has an assigned a priority. The highest priority
|
||||
message is be at the front of the queue.
|
||||
|
||||
The maximum number of messages that a message queue may accept is
|
||||
specified at creation by the mq_maxmsg field of the attribute structure.
|
||||
If this amount is exceeded, the behavior of the process is determined
|
||||
according to what oflag was used when the message queue was opened. If
|
||||
the queue was opened with O_NONBLOCK flag set, the process does not block,
|
||||
and an error is returned. If the O_NONBLOCK flag was not set, the process
|
||||
does block and wait for space on the queue.
|
||||
|
||||
Receiving a Message from a Message Queue
|
||||
----------------------------------------
|
||||
|
||||
The mq_receive() function is used to receive the oldest of the highest
|
||||
priority message(s) from the message queue specified by mqdes. The
|
||||
messages are received in FIFO order within the priorities. The received
|
||||
message’s priority is stored in the location referenced by the msg_prio.
|
||||
If the msg_prio is a NULL, the priority is discarded. The message is
|
||||
removed and stored in an area pointed to by msg_ptr whose length is of
|
||||
msg_len. The msg_len must be at least equal to the mq_msgsize attribute
|
||||
of the message queue.
|
||||
|
||||
The blocking behavior of the message queue is set by O_NONBLOCK at mq_open
|
||||
or by setting O_NONBLOCK in mq_flags in a call to mq_setattr. If this is
|
||||
a blocking queue, the process does block and wait on an empty queue. If
|
||||
this a non-blocking queue, the process does not block. Upon successful
|
||||
completion, mq_receive returns the length of the selected message in bytes
|
||||
and the message is removed from the queue.
|
||||
|
||||
Notification of Receipt of a Message on an Empty Queue
|
||||
------------------------------------------------------
|
||||
|
||||
The mq_notify() function registers the calling process to be notified of
|
||||
message arrival at an empty message queue. Every message queue has the
|
||||
ability to notify one (and only one) process whenever the queue’s state
|
||||
changes from empty (0 messages) to nonempty. This means that the process
|
||||
does not have to block or constantly poll while it waits for a message.
|
||||
By calling mq_notify, a notification request is attached to a message
|
||||
queue. When a message is received by an empty queue, if there are no
|
||||
processes blocked and waiting for the message, then the queue notifies the
|
||||
requesting process of a message arrival. There is only one signal sent by
|
||||
the message queue, after that the notification request is de-registered
|
||||
and another process can attach its notification request. After receipt of
|
||||
a notification, a process must re-register if it wishes to be notified
|
||||
again.
|
||||
|
||||
If there is a process blocked and waiting for the message, that process
|
||||
gets the message, and notification is not sent. Only one process can have
|
||||
a notification request attached to a message queue at any one time. If
|
||||
another process attempts to register a notification request, it fails.
|
||||
You can de-register for a message queue by passing a NULL to mq_notify,
|
||||
this removes any notification request attached to the queue. Whenever the
|
||||
message queue is closed, all notification attachments are removed.
|
||||
|
||||
Setting the Attributes of a Message Queue
|
||||
-----------------------------------------
|
||||
|
||||
The mq_setattr() function is used to set attributes associated with the
|
||||
open message queue description referenced by the message queue descriptor
|
||||
specified by mqdes. The \*omqstat represents the old or previous
|
||||
attributes. If omqstat is non-NULL, the function mq_setattr() stores, in
|
||||
the location referenced by omqstat, the previous message queue attributes
|
||||
and the current queue status. These values are the same as would be
|
||||
returned by a call to mq_getattr() at that point.
|
||||
|
||||
There is only one mq_attr.mq_flag that can be altered by this call. This
|
||||
is the flag that deals with the blocking and non-blocking behavior of the
|
||||
message queue. If the flag is set then the message queue is non-blocking,
|
||||
and requests to send or receive do not block while waiting for resources.
|
||||
If the flag is not set, then message send and receive may involve waiting
|
||||
for an empty queue or waiting for a message to arrive.
|
||||
|
||||
Getting the Attributes of a Message Queue
|
||||
-----------------------------------------
|
||||
|
||||
The mq_getattr() function is used to get status information and attributes
|
||||
of the message queue associated with the message queue descriptor. The
|
||||
results are returned in the mq_attr structure referenced by the mqstat
|
||||
argument. All of these attributes are set at create time, except the
|
||||
blocking/non-blocking behavior of the message queue which can be
|
||||
dynamically set by using mq_setattr. The attribute mq_curmsg is set to
|
||||
reflect the number of messages on the queue at the time that mq_getattr
|
||||
was called.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the message passing manager’s directives. A
|
||||
subsection is dedicated to each of this manager’s directives and describes
|
||||
the calling sequence, related constants, usage, and status codes.
|
||||
|
||||
mq_open - Open a Message Queue
|
||||
------------------------------
|
||||
.. index:: mq_open
|
||||
.. index:: open a message queue
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
mqd_t mq_open(
|
||||
const char \*name,
|
||||
int oflag,
|
||||
mode_t mode,
|
||||
struct mq_attr \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EACCES`` - Either the message queue exists and the permissions
|
||||
requested in oflags were denied, or the message does not exist and
|
||||
permission to create one is denied.
|
||||
|
||||
``EEXIST`` - You tried to create a message queue that already exists.
|
||||
|
||||
``EINVAL`` - An inappropriate name was given for the message queue, or
|
||||
the values of mq-maxmsg or mq_msgsize were less than 0.
|
||||
|
||||
``ENOENT`` - The message queue does not exist, and you did not specify
|
||||
to create it.
|
||||
|
||||
``EINTR`` - The call to mq_open was interrupted by a signal.
|
||||
|
||||
``EMFILE`` - The process has too many files or message queues open.
|
||||
This is a process limit error.
|
||||
|
||||
``ENFILE`` - The system has run out of resources to support more open
|
||||
message queues. This is a system error.
|
||||
|
||||
``ENAMETOOLONG`` - mq_name is too long.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_open () function establishes the connection between a process and a
|
||||
message queue with a message queue descriptor. If the message queue
|
||||
already exists, mq_open opens it, if the message queue does not exist,
|
||||
mq_open creates it. Message queues can have multiple senders and
|
||||
receivers. If mq_open is successful, the function returns a message queue
|
||||
descriptor. Otherwise, the function returns a -1 and sets ’errno’ to
|
||||
indicate the error.
|
||||
|
||||
The name of the message queue is used as an argument. For the best of
|
||||
portability, the name of the message queue should begin with a "/" and no
|
||||
other "/" should be in the name. Different systems interpret the name in
|
||||
different ways.
|
||||
|
||||
The oflags contain information on how the message is opened if the queue
|
||||
already exists. This may be O_RDONLY for read only, O_WRONLY for write
|
||||
only, of O_RDWR, for read and write.
|
||||
|
||||
In addition, the oflags contain information needed in the creation of a
|
||||
message queue. ``O_NONBLOCK`` - If the non-block flag is set then the
|
||||
message queue is non-blocking, and requests to send and receive messages
|
||||
do not block waiting for resources. If the flag is not set then the
|
||||
message queue is blocking, and a request to send might have to wait for an
|
||||
empty message queue. Similarly, a request to receive might have to wait
|
||||
for a message to arrive on the queue. ``O_CREAT`` - This call specifies
|
||||
that the call the mq_open is to create a new message queue. In this case
|
||||
the mode and attribute arguments of the function call are utilized. The
|
||||
message queue is created with a mode similar to the creation of a file,
|
||||
read and write permission creator, group, and others.
|
||||
|
||||
The geometry of the message queue is contained in the attribute structure.
|
||||
This includes mq_msgsize that dictates the maximum size of a single
|
||||
message, and the mq_maxmsg that dictates the maximum number of messages
|
||||
the queue can hold at one time. If a NULL is used in the mq_attr
|
||||
argument, then the message queue is created with implementation defined
|
||||
defaults. ``O_EXCL`` - is always set if O_CREAT flag is set. If the
|
||||
message queue already exists, O_EXCL causes an error message to be
|
||||
returned, otherwise, the new message queue fails and appends to the
|
||||
existing one.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The mq_open () function does not add or remove messages from the queue.
|
||||
When a new message queue is being created, the mq_flag field of the
|
||||
attribute structure is not used.
|
||||
|
||||
mq_close - Close a Message Queue
|
||||
--------------------------------
|
||||
.. index:: mq_close
|
||||
.. index:: close a message queue
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
int mq_close(
|
||||
mqd_t mqdes
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EINVAL`` - The descriptor does not represent a valid open message
|
||||
queue
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_close function removes the association between the message queue
|
||||
descriptor, mqdes, and its message queue. If mq_close() is successfully
|
||||
completed, the function returns a value of zero; otherwise, the function
|
||||
returns a value of -1 and sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the process had successfully attached a notification request to the
|
||||
message queue via mq_notify, this attachment is removed, and the message
|
||||
queue is available for another process to attach for notification.
|
||||
mq_close has no effect on the contents of the message queue, all the
|
||||
messages that were in the queue remain in the queue.
|
||||
|
||||
mq_unlink - Remove a Message Queue
|
||||
----------------------------------
|
||||
.. index:: mq_unlink
|
||||
.. index:: remove a message queue
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
int mq_unlink(
|
||||
const char \*name
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EINVAL`` - The descriptor does not represent a valid message queue
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_unlink() function removes the named message queue. If the message
|
||||
queue is not open when mq_unlink is called, then the queue is immediately
|
||||
eliminated. Any messages that were on the queue are lost, and the queue
|
||||
can not be opened again. If processes have the queue open when mq_unlink
|
||||
is called, the removal of the queue is delayed until the last process
|
||||
using the queue has finished. However, the name of the message queue is
|
||||
removed so that no other process can open it. Upon successful completion,
|
||||
the function returns a value of zero. Otherwise, the named message queue
|
||||
is not changed by this function call, and the function returns a value of
|
||||
-1 and sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Calls to mq_open() to re-create the message queue may fail until the
|
||||
message queue is actually removed. However, the mq_unlink() call need not
|
||||
block until all references have been closed; it may return immediately.
|
||||
|
||||
mq_send - Send a Message to a Message Queue
|
||||
-------------------------------------------
|
||||
.. index:: mq_send
|
||||
.. index:: send a message to a message queue
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include<mqueue.h>
|
||||
int mq_send(
|
||||
mqd_t mqdes,
|
||||
const char \*msg_ptr,
|
||||
size_t msg_len,
|
||||
unsigned int msg_prio
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EBADF`` - The descriptor does not represent a valid message queue, or the queue was opened for read only O_RDONLY``EINVAL`` - The value of msg_prio was greater than the MQ_PRIO_MAX.``EMSGSIZE`` - The msg_len is greater than the mq_msgsize attribute of the message queue``EAGAIN`` - The message queue is non-blocking, and there is no room on the queue for another message as specified by the mq_maxmsg.``EINTR`` - The message queue is blocking. While the process was waiting for free space on the queue, a signal arrived that interrupted the wait.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_send() function adds the message pointed to by the argument msg_ptr
|
||||
to the message queue specified by mqdes. Each message is assigned a
|
||||
priority , from 0 to MQ_PRIO_MAX. MQ_PRIO_MAX is defined in <limits.h> and
|
||||
must be at least 32. Messages are added to the queue in order of their
|
||||
priority. The highest priority message is at the front of the queue.
|
||||
|
||||
The maximum number of messages that a message queue may accept is
|
||||
specified at creation by the mq_maxmsg field of the attribute structure.
|
||||
If this amount is exceeded, the behavior of the process is determined
|
||||
according to what oflag was used when the message queue was opened. If
|
||||
the queue was opened with O_NONBLOCK flag set, then the EAGAIN error is
|
||||
returned. If the O_NONBLOCK flag was not set, the process blocks and
|
||||
waits for space on the queue, unless it is interrupted by a signal.
|
||||
|
||||
Upon successful completion, the mq_send () function returns a value of
|
||||
zero. Otherwise, no message is enqueued, the function returns -1, and
|
||||
errno is set to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the specified message queue is not full, mq_send inserts the message at
|
||||
the position indicated by the msg_prio argument.
|
||||
|
||||
mq_receive - Receive a Message from a Message Queue
|
||||
---------------------------------------------------
|
||||
.. index:: mq_receive
|
||||
.. index:: receive a message from a message queue
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
size_t mq_receive(
|
||||
mqd_t mqdes,
|
||||
char \*msg_ptr,
|
||||
size_t msg_len,
|
||||
unsigned int \*msg_prio
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EBADF`` - The descriptor does not represent a valid message queue, or the queue was opened for write only O_WRONLY``EMSGSIZE`` - The msg_len is less than the mq_msgsize attribute of the message queue``EAGAIN`` - The message queue is non-blocking, and the queue is empty``EINTR`` - The message queue is blocking. While the process was waiting for a message to arrive on the queue, a signal arrived that interrupted the wait.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_receive function is used to receive the oldest of the highest
|
||||
priority message(s) from the message queue specified by mqdes. The
|
||||
messages are received in FIFO order within the priorities. The received
|
||||
message’s priority is stored in the location referenced by the msg_prio.
|
||||
If the msg_prio is a NULL, the priority is discarded. The message is
|
||||
removed and stored in an area pointed to by msg_ptr whose length is of
|
||||
msg_len. The msg_len must be at least equal to the mq_msgsize attribute
|
||||
of the message queue.
|
||||
|
||||
The blocking behavior of the message queue is set by O_NONBLOCK at mq_open
|
||||
or by setting O_NONBLOCK in mq_flags in a call to mq_setattr. If this is
|
||||
a blocking queue, the process blocks and waits on an empty queue. If this
|
||||
a non-blocking queue, the process does not block.
|
||||
|
||||
Upon successful completion, mq_receive returns the length of the selected
|
||||
message in bytes and the message is removed from the queue. Otherwise, no
|
||||
message is removed from the queue, the function returns a value of -1, and
|
||||
sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the size of the buffer in bytes, specified by the msg_len argument, is
|
||||
less than the mq_msgsize attribute of the message queue, the function
|
||||
fails and returns an error
|
||||
|
||||
mq_notify - Notify Process that a Message is Available
|
||||
------------------------------------------------------
|
||||
.. index:: mq_notify
|
||||
.. index:: notify process that a message is available
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
int mq_notify(
|
||||
mqd_t mqdes,
|
||||
const struct sigevent \*notification
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EBADF`` - The descriptor does not refer to a valid message queue``EBUSY`` - A notification request is already attached to the queue
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
If the argument notification is not NULL, this function registers the
|
||||
calling process to be notified of message arrival at an empty message
|
||||
queue associated with the specified message queue descriptor, mqdes.
|
||||
|
||||
Every message queue has the ability to notify one (and only one) process
|
||||
whenever the queue’s state changes from empty (0 messages) to nonempty.
|
||||
This means that the process does not have to block or constantly poll
|
||||
while it waits for a message. By calling mq_notify, a notification
|
||||
request is attached to a message queue. When a message is received by an
|
||||
empty queue, if there are no processes blocked and waiting for the
|
||||
message, then the queue notifies the requesting process of a message
|
||||
arrival. There is only one signal sent by the message queue, after that
|
||||
the notification request is de-registered and another process can attach
|
||||
its notification request. After receipt of a notification, a process must
|
||||
re-register if it wishes to be notified again.
|
||||
|
||||
If there is a process blocked and waiting for the message, that process
|
||||
gets the message, and notification is not be sent. Only one process can
|
||||
have a notification request attached to a message queue at any one time.
|
||||
If another process attempts to register a notification request, it fails.
|
||||
You can de-register for a message queue by passing a NULL to mq_notify;
|
||||
this removes any notification request attached to the queue. Whenever the
|
||||
message queue is closed, all notification attachments are removed.
|
||||
|
||||
Upon successful completion, mq_notify returns a value of zero; otherwise,
|
||||
the function returns a value of -1 and sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
It is possible for another process to receive the message after the notification is sent but before the notified process has sent its receive request.
|
||||
|
||||
mq_setattr - Set Message Queue Attributes
|
||||
-----------------------------------------
|
||||
.. index:: mq_setattr
|
||||
.. index:: set message queue attributes
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
int mq_setattr(
|
||||
mqd_t mqdes,
|
||||
const struct mq_attr \*mqstat,
|
||||
struct mq_attr \*omqstat
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EBADF`` - The message queue descriptor does not refer to a valid, open queue.``EINVAL`` - The mq_flag value is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mq_setattr function is used to set attributes associated with the open
|
||||
message queue description referenced by the message queue descriptor
|
||||
specified by mqdes. The \*omqstat represents the old or previous
|
||||
attributes. If omqstat is non-NULL, the function mq_setattr() stores, in
|
||||
the location referenced by omqstat, the previous message queue attributes
|
||||
and the current queue status. These values are the same as would be
|
||||
returned by a call to mq_getattr() at that point.
|
||||
|
||||
There is only one mq_attr.mq_flag which can be altered by this call.
|
||||
This is the flag that deals with the blocking and non-blocking behavior of
|
||||
the message queue. If the flag is set then the message queue is
|
||||
non-blocking, and requests to send or receive do not block while waiting
|
||||
for resources. If the flag is not set, then message send and receive may
|
||||
involve waiting for an empty queue or waiting for a message to arrive.
|
||||
|
||||
Upon successful completion, the function returns a value of zero and the
|
||||
attributes of the message queue have been changed as specified.
|
||||
Otherwise, the message queue attributes is unchanged, and the function
|
||||
returns a value of -1 and sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
All other fields in the mq_attr are ignored by this call.
|
||||
|
||||
mq_getattr - Get Message Queue Attributes
|
||||
-----------------------------------------
|
||||
.. index:: mq_getattr
|
||||
.. index:: get message queue attributes
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <mqueue.h>
|
||||
int mq_getattr(
|
||||
mqd_t mqdes,
|
||||
struct mq_attr \*mqstat
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EBADF`` - The message queue descriptor does not refer to a valid,
|
||||
open message queue.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The mqdes argument specifies a message queue descriptor. The mq_getattr
|
||||
function is used to get status information and attributes of the message
|
||||
queue associated with the message queue descriptor. The results are
|
||||
returned in the mq_attr structure referenced by the mqstat argument. All
|
||||
of these attributes are set at create time, except the
|
||||
blocking/non-blocking behavior of the message queue which can be
|
||||
dynamically set by using mq_setattr. The attribute mq_curmsg is set to
|
||||
reflect the number of messages on the queue at the time that mq_getattr
|
||||
was called.
|
||||
|
||||
Upon successful completion, the mq_getattr function returns zero.
|
||||
Otherwise, the function returns -1 and sets errno to indicate the error.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2014.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
626
posix_users/mutex.rst
Normal file
626
posix_users/mutex.rst
Normal file
@ -0,0 +1,626 @@
|
||||
Mutex Manager
|
||||
#############
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The mutex manager implements the functionality required of the mutex
|
||||
manager as defined by POSIX 1003.1b-1996. This standard requires that
|
||||
a compliant operating system provide the facilties to ensure that
|
||||
threads can operate with mutual exclusion from one another and
|
||||
defines the API that must be provided.
|
||||
|
||||
The services provided by the mutex manager are:
|
||||
|
||||
- ``pthread_mutexattr_init`` - Initialize a Mutex Attribute Set
|
||||
|
||||
- ``pthread_mutexattr_destroy`` - Destroy a Mutex Attribute Set
|
||||
|
||||
- ``pthread_mutexattr_setprotocol`` - Set the Blocking Protocol
|
||||
|
||||
- ``pthread_mutexattr_getprotocol`` - Get the Blocking Protocol
|
||||
|
||||
- ``pthread_mutexattr_setprioceiling`` - Set the Priority Ceiling
|
||||
|
||||
- ``pthread_mutexattr_getprioceiling`` - Get the Priority Ceiling
|
||||
|
||||
- ``pthread_mutexattr_setpshared`` - Set the Visibility
|
||||
|
||||
- ``pthread_mutexattr_getpshared`` - Get the Visibility
|
||||
|
||||
- ``pthread_mutex_init`` - Initialize a Mutex
|
||||
|
||||
- ``pthread_mutex_destroy`` - Destroy a Mutex
|
||||
|
||||
- ``pthread_mutex_lock`` - Lock a Mutex
|
||||
|
||||
- ``pthread_mutex_trylock`` - Poll to Lock a Mutex
|
||||
|
||||
- ``pthread_mutex_timedlock`` - Lock a Mutex with Timeout
|
||||
|
||||
- ``pthread_mutex_unlock`` - Unlock a Mutex
|
||||
|
||||
- ``pthread_mutex_setprioceiling`` - Dynamically Set the Priority Ceiling
|
||||
|
||||
- ``pthread_mutex_getprioceiling`` - Dynamically Get the Priority Ceiling
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Mutex Attributes
|
||||
----------------
|
||||
|
||||
Mutex attributes are utilized only at mutex creation time. A mutex
|
||||
attribute structure may be initialized and passed as an argument to
|
||||
the ``mutex_init`` routine. Note that the priority ceiling of
|
||||
a mutex may be set at run-time.
|
||||
|
||||
*blocking protcol*
|
||||
is the XXX
|
||||
|
||||
*priority ceiling*
|
||||
is the XXX
|
||||
|
||||
*pshared*
|
||||
is the XXX
|
||||
|
||||
PTHREAD_MUTEX_INITIALIZER
|
||||
-------------------------
|
||||
|
||||
This is a special value that a variable of type ``pthread_mutex_t``
|
||||
may be statically initialized to as shown below:
|
||||
.. code:: c
|
||||
|
||||
pthread_mutex_t my_mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
This indicates that ``my_mutex`` will be automatically initialized
|
||||
by an implicit call to ``pthread_mutex_init`` the first time
|
||||
the mutex is used.
|
||||
|
||||
Note that the mutex will be initialized with default attributes.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Services
|
||||
========
|
||||
|
||||
This section details the mutex manager’s services.
|
||||
A subsection is dedicated to each of this manager’s services
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
pthread_mutexattr_init - Initialize a Mutex Attribute Set
|
||||
---------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_init
|
||||
.. index:: initialize a mutex attribute set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_init(
|
||||
pthread_mutexattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutexattr_init`` routine initializes the mutex attributes
|
||||
object specified by ``attr`` with the default value for all of the
|
||||
individual attributes.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
XXX insert list of default attributes here.
|
||||
|
||||
pthread_mutexattr_destroy - Destroy a Mutex Attribute Set
|
||||
---------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_destroy
|
||||
.. index:: destroy a mutex attribute set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_destroy(
|
||||
pthread_mutexattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutex_attr_destroy`` routine is used to destroy a mutex
|
||||
attributes object. The behavior of using an attributes object after
|
||||
it is destroyed is implementation dependent.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
pthread_mutexattr_setprotocol - Set the Blocking Protocol
|
||||
---------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_setprotocol
|
||||
.. index:: set the blocking protocol
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_setprotocol(
|
||||
pthread_mutexattr_t \*attr,
|
||||
int protocol
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The protocol argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutexattr_setprotocol`` routine is used to set value of the``protocol`` attribute. This attribute controls the order in which
|
||||
threads waiting on this mutex will receive it.
|
||||
|
||||
The ``protocol`` can be one of the following:
|
||||
|
||||
*``PTHREAD_PRIO_NONE``*
|
||||
in which case blocking order is FIFO.
|
||||
|
||||
*``PTHREAD_PRIO_INHERIT``*
|
||||
in which case blocking order is priority with the priority inheritance
|
||||
protocol in effect.
|
||||
|
||||
*``PTHREAD_PRIO_PROTECT``*
|
||||
in which case blocking order is priority with the priority ceiling
|
||||
protocol in effect.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
There is currently no way to get simple priority blocking ordering
|
||||
with POSIX mutexes even though this could easily by supported by RTEMS.
|
||||
|
||||
pthread_mutexattr_getprotocol - Get the Blocking Protocol
|
||||
---------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_getprotocol
|
||||
.. index:: get the blocking protocol
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_getprotocol(
|
||||
pthread_mutexattr_t \*attr,
|
||||
int \*protocol
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The protocol pointer argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutexattr_getprotocol`` routine is used to obtain
|
||||
the value of the ``protocol`` attribute. This attribute controls
|
||||
the order in which threads waiting on this mutex will receive it.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
pthread_mutexattr_setprioceiling - Set the Priority Ceiling
|
||||
-----------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_setprioceiling
|
||||
.. index:: set the priority ceiling
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_setprioceiling(
|
||||
pthread_mutexattr_t \*attr,
|
||||
int prioceiling
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The prioceiling argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutexattr_setprioceiling`` routine is used to set value of the``prioceiling`` attribute. This attribute specifies the priority that
|
||||
is the ceiling for threads obtaining this mutex. Any task obtaining this
|
||||
mutex may not be of greater priority that the ceiling. If it is of lower
|
||||
priority, then its priority will be elevated to ``prioceiling``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
pthread_mutexattr_getprioceiling - Get the Priority Ceiling
|
||||
-----------------------------------------------------------
|
||||
.. index:: pthread_mutexattr_getprioceiling
|
||||
.. index:: get the priority ceiling
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_getprioceiling(
|
||||
const pthread_mutexattr_t \*attr,
|
||||
int \*prioceiling
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The prioceiling pointer argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``pthread_mutexattr_getprioceiling`` routine is used to obtain the
|
||||
value of the ``prioceiling`` attribute. This attribute specifies the
|
||||
priority ceiling for this mutex.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
pthread_mutexattr_setpshared - Set the Visibility
|
||||
-------------------------------------------------
|
||||
.. index:: pthread_mutexattr_setpshared
|
||||
.. index:: set the visibility
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_setpshared(
|
||||
pthread_mutexattr_t \*attr,
|
||||
int pshared
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The pshared argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutexattr_getpshared - Get the Visibility
|
||||
-------------------------------------------------
|
||||
.. index:: pthread_mutexattr_getpshared
|
||||
.. index:: get the visibility
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutexattr_getpshared(
|
||||
const pthread_mutexattr_t \*attr,
|
||||
int \*pshared
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute pointer argument is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The pshared pointer argument is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_init - Initialize a Mutex
|
||||
---------------------------------------
|
||||
.. index:: pthread_mutex_init
|
||||
.. index:: initialize a mutex
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_init(
|
||||
pthread_mutex_t \*mutex,
|
||||
const pthread_mutexattr_t \*attr
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The attribute set is not initialized.
|
||||
|
||||
*EINVAL*
|
||||
The specified protocol is invalid.
|
||||
|
||||
*EAGAIN*
|
||||
The system lacked the necessary resources to initialize another mutex.
|
||||
|
||||
*ENOMEM*
|
||||
Insufficient memory exists to initialize the mutex.
|
||||
|
||||
*EBUSY*
|
||||
Attempted to reinialize the object reference by mutex, a previously
|
||||
initialized, but not yet destroyed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_destroy - Destroy a Mutex
|
||||
---------------------------------------
|
||||
.. index:: pthread_mutex_destroy
|
||||
.. index:: destroy a mutex
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_destroy(
|
||||
pthread_mutex_t \*mutex
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
*EBUSY*
|
||||
Attempted to destroy the object reference by mutex, while it is locked or
|
||||
referenced by another thread.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_lock - Lock a Mutex
|
||||
---------------------------------
|
||||
.. index:: pthread_mutex_lock
|
||||
.. index:: lock a mutex
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_lock(
|
||||
pthread_mutex_t \*mutex
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
|
||||
priority of the calling thread is higher than the current priority
|
||||
ceiling.
|
||||
|
||||
*EDEADLK*
|
||||
The current thread already owns the mutex.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_trylock - Poll to Lock a Mutex
|
||||
--------------------------------------------
|
||||
.. index:: pthread_mutex_trylock
|
||||
.. index:: poll to lock a mutex
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_trylock(
|
||||
pthread_mutex_t \*mutex
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
|
||||
priority of the calling thread is higher than the current priority
|
||||
ceiling.
|
||||
|
||||
*EBUSY*
|
||||
The mutex is already locked.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_timedlock - Lock a Mutex with Timeout
|
||||
---------------------------------------------------
|
||||
.. index:: pthread_mutex_timedlock
|
||||
.. index:: lock a mutex with timeout
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
int pthread_mutex_timedlock(
|
||||
pthread_mutex_t \*mutex,
|
||||
const struct timespec \*timeout
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The nanoseconds field of timeout is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The mutex has the protocol attribute of PTHREAD_PRIO_PROTECT and the
|
||||
priority of the calling thread is higher than the current priority
|
||||
ceiling.
|
||||
|
||||
*EDEADLK*
|
||||
The current thread already owns the mutex.
|
||||
|
||||
*ETIMEDOUT*
|
||||
The calling thread was unable to obtain the mutex within the specified
|
||||
timeout period.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_unlock - Unlock a Mutex
|
||||
-------------------------------------
|
||||
.. index:: pthread_mutex_unlock
|
||||
.. index:: unlock a mutex
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_unlock(
|
||||
pthread_mutex_t \*mutex
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_setprioceiling - Dynamically Set the Priority Ceiling
|
||||
-------------------------------------------------------------------
|
||||
.. index:: pthread_mutex_setprioceiling
|
||||
.. index:: dynamically set the priority ceiling
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_setprioceiling(
|
||||
pthread_mutex_t \*mutex,
|
||||
int prioceiling,
|
||||
int \*oldceiling
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The oldceiling pointer parameter is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The prioceiling parameter is an invalid priority.
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_mutex_getprioceiling - Get the Current Priority Ceiling
|
||||
---------------------------------------------------------------
|
||||
.. index:: pthread_mutex_getprioceiling
|
||||
.. index:: get the current priority ceiling
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <pthread.h>
|
||||
int pthread_mutex_getprioceiling(
|
||||
pthread_mutex_t \*mutex,
|
||||
int \*prioceiling
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The prioceiling pointer parameter is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The specified mutex is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
69
posix_users/preface.rst
Normal file
69
posix_users/preface.rst
Normal file
@ -0,0 +1,69 @@
|
||||
Preface
|
||||
#######
|
||||
|
||||
This is the User’s Guide for the POSIX API support
|
||||
provided in RTEMS.
|
||||
|
||||
The functionality described in this document is based
|
||||
on the following standards:
|
||||
|
||||
- POSIX 1003.1b-1993.
|
||||
|
||||
- POSIX 1003.1h/D3.
|
||||
|
||||
- Open Group Single UNIX Specification.
|
||||
|
||||
Much of the POSIX API standard is actually implemented in the
|
||||
Cygnus Newlib ANSI C Library. Please refer to documentation on
|
||||
Newlib for more information on the functionality it supplies.
|
||||
|
||||
This manual is still under construction and improvements
|
||||
are welcomed from users.
|
||||
|
||||
Acknowledgements
|
||||
================
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2009.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
||||
.. COMMENT: The RTEMS Project has been granted permission from The Open Group
|
||||
|
||||
.. COMMENT: IEEE to excerpt and use portions of the POSIX standards documents
|
||||
|
||||
.. COMMENT: in the RTEMS POSIX API User's Guide and RTEMS Shell User's Guide.
|
||||
|
||||
.. COMMENT: We have to include a specific acknowledgement paragraph in these
|
||||
|
||||
.. COMMENT: documents (e.g. preface or copyright page) and another slightly
|
||||
|
||||
.. COMMENT: different paragraph for each manual page that excerpts and uses
|
||||
|
||||
.. COMMENT: text from the standards.
|
||||
|
||||
.. COMMENT: This file should help ensure that the paragraphs are consistent
|
||||
|
||||
.. COMMENT: and not duplicated
|
||||
|
||||
The Institute of Electrical and Electronics Engineers, Inc and The
|
||||
Open Group, have given us permission to reprint portions of their
|
||||
documentation.
|
||||
Portions of this text are reprinted and reproduced in electronic
|
||||
form from IEEE Std 1003.1, 2004 Edition, Standard for Information
|
||||
Technology â Operating System Interface (POSIX), The Open
|
||||
Group Base Specifications Issue 6, Copyright © 2001-2004 by the
|
||||
Institute of Electrical and Electronics Engineers, Inc and The
|
||||
Open Group. In the event of any discrepancy between this version
|
||||
and the original IEEE and The Open Group Standard, the original
|
||||
IEEE and The Open Group Standard is the referee document. The
|
||||
original Standard can be obtained online athttp://www.opengroup.org/unix/online.html.
|
||||
This notice shall appear on any product containing this material.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
374
posix_users/process_creation_and_execution.rst
Normal file
374
posix_users/process_creation_and_execution.rst
Normal file
@ -0,0 +1,374 @@
|
||||
Process Creation and Execution Manager
|
||||
######################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The process creation and execution manager provides the
|
||||
functionality associated with the creation and termination
|
||||
of processes.
|
||||
|
||||
The directives provided by the process creation and execution manager are:
|
||||
|
||||
- ``fork`` - Create a Process
|
||||
|
||||
- ``execl`` - Execute a File
|
||||
|
||||
- ``execv`` - Execute a File
|
||||
|
||||
- ``execle`` - Execute a File
|
||||
|
||||
- ``execve`` - Execute a File
|
||||
|
||||
- ``execlp`` - Execute a File
|
||||
|
||||
- ``execvp`` - Execute a File
|
||||
|
||||
- ``pthread_atfork`` - Register Fork Handlers
|
||||
|
||||
- ``wait`` - Wait for Process Termination
|
||||
|
||||
- ``waitpid`` - Wait for Process Termination
|
||||
|
||||
- ``_exit`` - Terminate a Process
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
POSIX process functionality can not be completely
|
||||
supported by RTEMS. This is because RTEMS provides no memory
|
||||
protection and implements a *single process, multi-threaded
|
||||
execution model*. In this light, RTEMS provides none of the
|
||||
routines that are associated with the creation of new processes.
|
||||
However, since the entire RTEMS application (e.g. executable)
|
||||
is logically a single POSIX process, RTEMS is able to provide
|
||||
implementations of many operations on processes. The rule of
|
||||
thumb is that those routines provide a meaningful result.
|
||||
For example, ``getpid()`` returns the node number.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
The only functionality method defined by this manager which is
|
||||
supported by RTEMS is the ``_exit`` service. The
|
||||
implementation of ``_exit`` shuts the application down and
|
||||
is equivalent to invoking either ``exit`` or``rtems_shutdown_executive``.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the process creation and execution manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
fork - Create a Process
|
||||
-----------------------
|
||||
.. index:: fork
|
||||
.. index:: create a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
int fork( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execl - Execute a File
|
||||
----------------------
|
||||
.. index:: execl
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execl(
|
||||
const char \*path,
|
||||
const char \*arg,
|
||||
...
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execv - Execute a File
|
||||
----------------------
|
||||
.. index:: execv
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execv(
|
||||
const char \*path,
|
||||
char const \*argv[],
|
||||
...
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execle - Execute a File
|
||||
-----------------------
|
||||
.. index:: execle
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execle(
|
||||
const char \*path,
|
||||
const char \*arg,
|
||||
...
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execve - Execute a File
|
||||
-----------------------
|
||||
.. index:: execve
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execve(
|
||||
const char \*path,
|
||||
char \*const argv[],
|
||||
char \*const envp[]
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execlp - Execute a File
|
||||
-----------------------
|
||||
.. index:: execlp
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execlp(
|
||||
const char \*file,
|
||||
const char \*arg,
|
||||
...
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
execvp - Execute a File
|
||||
-----------------------
|
||||
.. index:: execvp
|
||||
.. index:: execute a file
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int execvp(
|
||||
const char \*file,
|
||||
char \*const argv[]
|
||||
...
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
pthread_atfork - Register Fork Handlers
|
||||
---------------------------------------
|
||||
.. index:: pthread_atfork
|
||||
.. index:: register fork handlers
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
int pthread_atfork(
|
||||
void (\*prepare)(void),
|
||||
void (\*parent)(void),
|
||||
void (\*child)(void)
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
wait - Wait for Process Termination
|
||||
-----------------------------------
|
||||
.. index:: wait
|
||||
.. index:: wait for process termination
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
int wait(
|
||||
int \*stat_loc
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
waitpid - Wait for Process Termination
|
||||
--------------------------------------
|
||||
.. index:: waitpid
|
||||
.. index:: wait for process termination
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int wait(
|
||||
pid_t pid,
|
||||
int \*stat_loc,
|
||||
int options
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine is not supported by RTEMS.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
_exit - Terminate a Process
|
||||
---------------------------
|
||||
.. index:: _exit
|
||||
.. index:: terminate a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
void _exit(
|
||||
int status
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
NONE
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``_exit()`` function terminates the calling process.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
In RTEMS, a process is equivalent to the entire application on a single
|
||||
processor. Invoking this service terminates the application.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
765
posix_users/process_environment.rst
Normal file
765
posix_users/process_environment.rst
Normal file
@ -0,0 +1,765 @@
|
||||
Process Environment Manager
|
||||
###########################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The process environment manager is responsible for providing the
|
||||
functions related to user and group Id management.
|
||||
|
||||
The directives provided by the process environment manager are:
|
||||
|
||||
- ``getpid`` - Get Process ID
|
||||
|
||||
- ``getppid`` - Get Parent Process ID
|
||||
|
||||
- ``getuid`` - Get User ID
|
||||
|
||||
- ``geteuid`` - Get Effective User ID
|
||||
|
||||
- ``getgid`` - Get Real Group ID
|
||||
|
||||
- ``getegid`` - Get Effective Group ID
|
||||
|
||||
- ``setuid`` - Set User ID
|
||||
|
||||
- ``setgid`` - Set Group ID
|
||||
|
||||
- ``getgroups`` - Get Supplementary Group IDs
|
||||
|
||||
- ``getlogin`` - Get User Name
|
||||
|
||||
- ``getlogin_r`` - Reentrant Get User Name
|
||||
|
||||
- ``getpgrp`` - Get Process Group ID
|
||||
|
||||
- ``setsid`` - Create Session and Set Process Group ID
|
||||
|
||||
- ``setpgid`` - Set Process Group ID for Job Control
|
||||
|
||||
- ``uname`` - Get System Name
|
||||
|
||||
- ``times`` - Get Process Times
|
||||
|
||||
- ``getenv`` - Get Environment Variables
|
||||
|
||||
- ``setenv`` - Set Environment Variables
|
||||
|
||||
- ``ctermid`` - Generate Terminal Pathname
|
||||
|
||||
- ``ttyname`` - Determine Terminal Device Name
|
||||
|
||||
- ``ttyname_r`` - Reentrant Determine Terminal Device Name
|
||||
|
||||
- ``isatty`` - Determine if File Descriptor is Terminal
|
||||
|
||||
- ``sysconf`` - Get Configurable System Variables
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Users and Groups
|
||||
----------------
|
||||
|
||||
RTEMS provides a single process, multi-threaded execution environment.
|
||||
In this light, the notion of user and group is somewhat without meaning.
|
||||
But RTEMS does provide services to provide a synthetic version of
|
||||
user and group. By default, a single user and group is associated
|
||||
with the application. Thus unless special actions are taken,
|
||||
every thread in the application shares the same user and group Id.
|
||||
The initial rationale for providing user and group Id functionality
|
||||
in RTEMS was for the filesystem infrastructure to implement
|
||||
file permission checks. The effective user/group Id capability
|
||||
has since been used to implement permissions checking by
|
||||
the ``ftpd`` server.
|
||||
|
||||
In addition to the "real" user and group Ids, a process may
|
||||
have an effective user/group Id. This allows a process to
|
||||
function using a more limited permission set for certain operations.
|
||||
|
||||
User and Group Names
|
||||
--------------------
|
||||
|
||||
POSIX considers user and group Ids to be a unique integer that
|
||||
may be associated with a name. This is usually accomplished
|
||||
via a file named ``/etc/passwd`` for user Id mapping and``/etc/groups`` for group Id mapping. Again, although
|
||||
RTEMS is effectively a single process and thus single user
|
||||
system, it provides limited support for user and group
|
||||
names. When configured with an appropriate filesystem, RTEMS
|
||||
will access the appropriate files to map user and group Ids
|
||||
to names.
|
||||
|
||||
If these files do not exist, then RTEMS will synthesize
|
||||
a minimal version so this family of services return without
|
||||
error. It is important to remember that a design goal of
|
||||
the RTEMS POSIX services is to provide useable and
|
||||
meaningful results even though a full process model
|
||||
is not available.
|
||||
|
||||
Environment Variables
|
||||
---------------------
|
||||
|
||||
POSIX allows for variables in the run-time environment. These are
|
||||
name/value pairs that make be dynamically set and obtained by
|
||||
programs. In a full POSIX environment with command line shell
|
||||
and multiple processes, environment variables may be set in
|
||||
one process – such as the shell – and inherited by child
|
||||
processes. In RTEMS, there is only one process and thus
|
||||
only one set of environment variables across all processes.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
Accessing User and Group Ids
|
||||
----------------------------
|
||||
|
||||
The user Id associated with the current thread may be obtain
|
||||
using the ``getuid()`` service. Similarly, the group Id
|
||||
may be obtained using the ``getgid()`` service.
|
||||
|
||||
Accessing Environment Variables
|
||||
-------------------------------
|
||||
|
||||
The value associated with an environment variable may be
|
||||
obtained using the ``getenv()`` service and set using
|
||||
the ``putenv()`` service.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the process environment manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
getpid - Get Process ID
|
||||
-----------------------
|
||||
.. index:: getpid
|
||||
.. index:: get process id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getpid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The process Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the process Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getppid - Get Parent Process ID
|
||||
-------------------------------
|
||||
.. index:: getppid
|
||||
.. index:: get parent process id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getppid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The parent process Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the parent process Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getuid - Get User ID
|
||||
--------------------
|
||||
.. index:: getuid
|
||||
.. index:: get user id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getuid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The effective user Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the effective user Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
geteuid - Get Effective User ID
|
||||
-------------------------------
|
||||
.. index:: geteuid
|
||||
.. index:: get effective user id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int geteuid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The effective group Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the effective group Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getgid - Get Real Group ID
|
||||
--------------------------
|
||||
.. index:: getgid
|
||||
.. index:: get real group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The group Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the group Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getegid - Get Effective Group ID
|
||||
--------------------------------
|
||||
.. index:: getegid
|
||||
.. index:: get effective group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getegid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The effective group Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the effective group Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
setuid - Set User ID
|
||||
--------------------
|
||||
.. index:: setuid
|
||||
.. index:: set user id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setuid(
|
||||
uid_t uid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This service returns 0.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service sets the user Id to ``uid``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
setgid - Set Group ID
|
||||
---------------------
|
||||
.. index:: setgid
|
||||
.. index:: set group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setgid(
|
||||
gid_t gid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This service returns 0.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service sets the group Id to ``gid``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getgroups - Get Supplementary Group IDs
|
||||
---------------------------------------
|
||||
.. index:: getgroups
|
||||
.. index:: get supplementary group ids
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgroups(
|
||||
int gidsetsize,
|
||||
gid_t grouplist[]
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
NA
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service is not implemented as RTEMS has no notion of
|
||||
supplemental groups.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If supported, this routine would only be allowed for
|
||||
the super-user.
|
||||
|
||||
getlogin - Get User Name
|
||||
------------------------
|
||||
.. index:: getlogin
|
||||
.. index:: get user name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
char \*getlogin( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
Returns a pointer to a string containing the name of the
|
||||
current user.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine returns the name of the current user.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is not reentrant and subsequent calls to``getlogin()`` will overwrite the same buffer.
|
||||
|
||||
getlogin_r - Reentrant Get User Name
|
||||
------------------------------------
|
||||
.. index:: getlogin_r
|
||||
.. index:: reentrant get user name
|
||||
.. index:: get user name, reentrant
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getlogin_r(
|
||||
char \*name,
|
||||
size_t namesize
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The arguments were invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This is a reentrant version of the ``getlogin()`` service. The
|
||||
caller specified their own buffer, ``name``, as well as the
|
||||
length of this buffer, ``namesize``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
getpgrp - Get Process Group ID
|
||||
------------------------------
|
||||
.. index:: getpgrp
|
||||
.. index:: get process group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
pid_t getpgrp( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The procress group Id is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the current progress group Id.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine is implemented in a somewhat meaningful
|
||||
way for RTEMS but is truly not functional.
|
||||
|
||||
setsid - Create Session and Set Process Group ID
|
||||
------------------------------------------------
|
||||
.. index:: setsid
|
||||
.. index:: create session and set process group id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
pid_t setsid( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EPERM*
|
||||
The application does not have permission to create a process group.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine always returns ``EPERM`` as RTEMS has no way
|
||||
to create new processes and thus no way to create a new process
|
||||
group.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
setpgid - Set Process Group ID for Job Control
|
||||
----------------------------------------------
|
||||
.. index:: setpgid
|
||||
.. index:: set process group id for job control
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setpgid(
|
||||
pid_t pid,
|
||||
pid_t pgid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*ENOSYS*
|
||||
The routine is not implemented.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service is not implemented for RTEMS as process groups are not
|
||||
supported.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
uname - Get System Name
|
||||
-----------------------
|
||||
.. index:: uname
|
||||
.. index:: get system name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int uname(
|
||||
struct utsname \*name
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EPERM*
|
||||
The provided structure pointer is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns system information to the caller. It does this
|
||||
by filling in the ``struct utsname`` format structure for the
|
||||
caller.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The information provided includes the operating system (RTEMS in
|
||||
all configurations), the node number, the release as the RTEMS
|
||||
version, and the CPU family and model. The CPU model name
|
||||
will indicate the multilib executive variant being used.
|
||||
|
||||
times - Get process times
|
||||
-------------------------
|
||||
.. index:: times
|
||||
.. index:: get process times
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/time.h>
|
||||
clock_t times(
|
||||
struct tms \*ptms
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine returns the number of clock ticks that have elapsed
|
||||
since the system was initialized (e.g. the application was
|
||||
started).
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
``times`` stores the current process times in ``ptms``. The
|
||||
format of ``struct tms`` is as defined in``<sys/times.h>``. RTEMS fills in the field ``tms_utime``
|
||||
with the number of ticks that the calling thread has executed
|
||||
and the field ``tms_stime`` with the number of clock ticks
|
||||
since system boot (also returned). All other fields in the``ptms`` are left zero.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
RTEMS has no way to distinguish between user and system time
|
||||
so this routine returns the most meaningful information
|
||||
possible.
|
||||
|
||||
getenv - Get Environment Variables
|
||||
----------------------------------
|
||||
.. index:: getenv
|
||||
.. index:: get environment variables
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
char \*getenv(
|
||||
const char \*name
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*NULL*
|
||||
when no match
|
||||
|
||||
*pointer to value*
|
||||
when successful
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service searches the set of environment variables for
|
||||
a string that matches the specified ``name``. If found,
|
||||
it returns the associated value.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The environment list consists of name value pairs that
|
||||
are of the form *name = value*.
|
||||
|
||||
setenv - Set Environment Variables
|
||||
----------------------------------
|
||||
.. index:: setenv
|
||||
.. index:: set environment variables
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int setenv(
|
||||
const char \*name,
|
||||
const char \*value,
|
||||
int overwrite
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
Returns 0 if successful and -1 otherwise.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service adds the variable ``name`` to the environment with``value``. If ``name`` is not already exist, then it is
|
||||
created. If ``name`` exists and ``overwrite`` is zero, then
|
||||
the previous value is not overwritten.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
ctermid - Generate Terminal Pathname
|
||||
------------------------------------
|
||||
.. index:: ctermid
|
||||
.. index:: generate terminal pathname
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
char \*ctermid(
|
||||
char \*s
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
Returns a pointer to a string indicating the pathname for the controlling
|
||||
terminal.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns the name of the terminal device associated with
|
||||
this process. If ``s`` is NULL, then a pointer to a static buffer
|
||||
is returned. Otherwise, ``s`` is assumed to have a buffer of
|
||||
sufficient size to contain the name of the controlling terminal.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
By default on RTEMS systems, the controlling terminal is ``/dev/console``.
|
||||
Again this implementation is of limited meaning, but it provides
|
||||
true and useful results which should be sufficient to ease porting
|
||||
applications from a full POSIX implementation to the reduced
|
||||
profile supported by RTEMS.
|
||||
|
||||
ttyname - Determine Terminal Device Name
|
||||
----------------------------------------
|
||||
.. index:: ttyname
|
||||
.. index:: determine terminal device name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
char \*ttyname(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
Pointer to a string containing the terminal device name or
|
||||
NULL is returned on any error.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns a pointer to the pathname of the terminal
|
||||
device that is open on the file descriptor ``fd``. If``fd`` is not a valid descriptor for a terminal device,
|
||||
then NULL is returned.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
This routine uses a static buffer.
|
||||
|
||||
ttyname_r - Reentrant Determine Terminal Device Name
|
||||
----------------------------------------------------
|
||||
.. index:: ttyname_r
|
||||
.. index:: reentrant determine terminal device name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int ttyname_r(
|
||||
int fd,
|
||||
char \*name,
|
||||
int namesize
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine returns -1 and sets ``errno`` as follows:
|
||||
|
||||
*EBADF*
|
||||
If not a valid descriptor for a terminal device.
|
||||
|
||||
*EINVAL*
|
||||
If ``name`` is NULL or ``namesize`` are insufficient.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service the pathname of the terminal device that is open
|
||||
on the file descriptor ``fd``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
isatty - Determine if File Descriptor is Terminal
|
||||
-------------------------------------------------
|
||||
.. index:: isatty
|
||||
.. index:: determine if file descriptor is terminal
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int isatty(
|
||||
int fd
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
Returns 1 if ``fd`` is a terminal device and 0 otherwise.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service returns 1 if ``fd`` is an open file descriptor
|
||||
connected to a terminal and 0 otherwise.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
sysconf - Get Configurable System Variables
|
||||
-------------------------------------------
|
||||
.. index:: sysconf
|
||||
.. index:: get configurable system variables
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
long sysconf(
|
||||
int name
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The value returned is the actual value of the system resource.
|
||||
If the requested configuration name is a feature flag, then
|
||||
1 is returned if the available and 0 if it is not. On any
|
||||
other error condition, -1 is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This service is the mechanism by which an application determines
|
||||
values for system limits or options at runtime.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Much of the information that may be obtained via ``sysconf``
|
||||
has equivalent macros in ``<unistd.h``. However, those
|
||||
macros reflect conservative limits which may have been altered
|
||||
by application configuration.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
192
posix_users/scheduler.rst
Normal file
192
posix_users/scheduler.rst
Normal file
@ -0,0 +1,192 @@
|
||||
Scheduler Manager
|
||||
#################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The scheduler manager ...
|
||||
|
||||
The directives provided by the scheduler manager are:
|
||||
|
||||
- ``sched_get_priority_min`` - Get Minimum Priority Value
|
||||
|
||||
- ``sched_get_priority_max`` - Get Maximum Priority Value
|
||||
|
||||
- ``sched_rr_get_interval`` - Get Timeslicing Quantum
|
||||
|
||||
- ``sched_yield`` - Yield the Processor
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Priority
|
||||
--------
|
||||
|
||||
In the RTEMS implementation of the POSIX API, the priorities range from
|
||||
the low priority of ``sched_get_priority_min()`` to the highest priority of``sched_get_priority_max()``. Numerically higher values represent higher
|
||||
priorities.
|
||||
|
||||
Scheduling Policies
|
||||
-------------------
|
||||
|
||||
The following scheduling policies are available:
|
||||
|
||||
*SCHED_FIFO*
|
||||
Priority-based, preemptive scheduling with no timeslicing. This is equivalent
|
||||
to what is called "manual round-robin" scheduling.
|
||||
|
||||
*SCHED_RR*
|
||||
Priority-based, preemptive scheduling with timeslicing. Time quantums are
|
||||
maintained on a per-thread basis and are not reset at each context switch.
|
||||
Thus, a thread which is preempted and subsequently resumes execution will
|
||||
attempt to complete the unused portion of its time quantum.
|
||||
|
||||
*SCHED_OTHER*
|
||||
Priority-based, preemptive scheduling with timeslicing. Time quantums are
|
||||
maintained on a per-thread basis and are reset at each context switch.
|
||||
|
||||
*SCHED_SPORADIC*
|
||||
Priority-based, preemptive scheduling utilizing three additional parameters:
|
||||
budget, replenishment period, and low priority. Under this policy, the
|
||||
thread is allowed to execute for "budget" amount of time before its priority
|
||||
is lowered to "low priority". At the end of each replenishment period,
|
||||
the thread resumes its initial priority and has its budget replenished.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the scheduler manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
sched_get_priority_min - Get Minimum Priority Value
|
||||
---------------------------------------------------
|
||||
.. index:: sched_get_priority_min
|
||||
.. index:: get minimum priority value
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sched.h>
|
||||
int sched_get_priority_min(
|
||||
int policy
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINVAL*
|
||||
The indicated policy is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine return the minimum (numerically and logically lowest) priority
|
||||
for the specified ``policy``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
sched_get_priority_max - Get Maximum Priority Value
|
||||
---------------------------------------------------
|
||||
.. index:: sched_get_priority_max
|
||||
.. index:: get maximum priority value
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sched.h>
|
||||
int sched_get_priority_max(
|
||||
int policy
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*EINVAL*
|
||||
The indicated policy is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine return the maximum (numerically and logically highest) priority
|
||||
for the specified ``policy``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
sched_rr_get_interval - Get Timeslicing Quantum
|
||||
-----------------------------------------------
|
||||
.. index:: sched_rr_get_interval
|
||||
.. index:: get timeslicing quantum
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sched.h>
|
||||
int sched_rr_get_interval(
|
||||
pid_t pid,
|
||||
struct timespec \*interval
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
On error, this routine returns -1 and sets errno to one of the following:
|
||||
|
||||
*ESRCH*
|
||||
The indicated process id is invalid.
|
||||
|
||||
*EINVAL*
|
||||
The specified interval pointer parameter is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This routine returns the length of the timeslice quantum in the``interval`` parameter for the specified ``pid``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The ``pid`` argument should be 0 to indicate the calling process.
|
||||
|
||||
sched_yield - Yield the Processor
|
||||
---------------------------------
|
||||
.. index:: sched_yield
|
||||
.. index:: yield the processor
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sched.h>
|
||||
int sched_yield( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This routine always returns zero to indicate success.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This call forces the calling thread to yield the processor to another
|
||||
thread. Normally this is used to implement voluntary round-robin
|
||||
task scheduling.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
NONE
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
503
posix_users/semaphore.rst
Normal file
503
posix_users/semaphore.rst
Normal file
@ -0,0 +1,503 @@
|
||||
Semaphore Manager
|
||||
#################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The semaphore manager provides functions to allocate, delete, and control
|
||||
semaphores. This manager is based on the POSIX 1003.1 standard.
|
||||
|
||||
The directives provided by the semaphore manager are:
|
||||
|
||||
- ``sem_init`` - Initialize an unnamed semaphore
|
||||
|
||||
- ``sem_destroy`` - Destroy an unnamed semaphore
|
||||
|
||||
- ``sem_open`` - Open a named semaphore
|
||||
|
||||
- ``sem_close`` - Close a named semaphore
|
||||
|
||||
- ``sem_unlink`` - Remove a named semaphore
|
||||
|
||||
- ``sem_wait`` - Lock a semaphore
|
||||
|
||||
- ``sem_trywait`` - Lock a semaphore
|
||||
|
||||
- ``sem_timedwait`` - Wait on a Semaphore for a Specified Time
|
||||
|
||||
- ``sem_post`` - Unlock a semaphore
|
||||
|
||||
- ``sem_getvalue`` - Get the value of a semeaphore
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Theory
|
||||
------
|
||||
|
||||
Semaphores are used for synchronization and mutual exclusion by indicating the
|
||||
availability and number of resources. The task (the task which is returning
|
||||
resources) notifying other tasks of an event increases the number of resources
|
||||
held by the semaphore by one. The task (the task which will obtain resources)
|
||||
waiting for the event decreases the number of resources held by the semaphore
|
||||
by one. If the number of resources held by a semaphore is insufficient (namely
|
||||
0), the task requiring resources will wait until the next time resources are
|
||||
returned to the semaphore. If there is more than one task waiting for a
|
||||
semaphore, the tasks will be placed in the queue.
|
||||
|
||||
"sem_t" Structure
|
||||
-----------------
|
||||
.. index:: sem_t
|
||||
|
||||
The ``sem_t`` structure is used to represent semaphores. It is passed as an
|
||||
argument to the semaphore directives and is defined as follows:
|
||||
.. code:: c
|
||||
|
||||
typedef int sem_t;
|
||||
|
||||
Building a Semaphore Attribute Set
|
||||
----------------------------------
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
Using as a Binary Semaphore
|
||||
---------------------------
|
||||
|
||||
Although POSIX supports mutexes, they are only visible between threads. To work
|
||||
between processes, a binary semaphore must be used.
|
||||
|
||||
Creating a semaphore with a limit on the count of 1 effectively restricts the
|
||||
semaphore to being a binary semaphore. When the binary semaphore is available,
|
||||
the count is 1. When the binary semaphore is unavailable, the count is 0.
|
||||
|
||||
Since this does not result in a true binary semaphore, advanced binary features like the Priority Inheritance and Priority Ceiling Protocols are not available.
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the semaphore manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
sem_init - Initialize an unnamed semaphore
|
||||
------------------------------------------
|
||||
.. index:: sem_init
|
||||
.. index:: initialize an unnamed semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_init(
|
||||
sem_t \*sem,
|
||||
int pshared,
|
||||
unsigned int value
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The value argument exceeds SEM_VALUE_MAX
|
||||
|
||||
*ENOSPC*
|
||||
A resource required to initialize the semaphore has been exhausted
|
||||
The limit on semaphores (SEM_VALUE_MAX) has been reached
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_init is not supported by this implementation
|
||||
|
||||
*EPERM*
|
||||
The process lacks appropriate privileges to initialize the semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_init function is used to initialize the unnamed semaphore referred to
|
||||
by "sem". The value of the initialized semaphore is the parameter "value". The
|
||||
semaphore remains valid until it is destroyed.
|
||||
|
||||
ADD MORE HERE XXX
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the functions completes successfully, it shall return a value of zero.
|
||||
Otherwise, it shall return a value of -1 and set "errno" to specify the error
|
||||
that occurred.
|
||||
|
||||
Multiprocessing is currently not supported in this implementation.
|
||||
|
||||
sem_destroy - Destroy an unnamed semaphore
|
||||
------------------------------------------
|
||||
.. index:: sem_destroy
|
||||
.. index:: destroy an unnamed semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_destroy(
|
||||
sem_t \*sem
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The value argument exceeds SEM_VALUE_MAX
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_init is not supported by this implementation
|
||||
|
||||
*EBUSY*
|
||||
There are currently processes blocked on the semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_destroy function is used to destroy an unnamed semaphore refered to by
|
||||
"sem". sem_destroy can only be used on a semaphore that was created using
|
||||
sem_init.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the functions completes successfully, it shall return a value of zero.
|
||||
Otherwise, it shall return a value of -1 and set "errno" to specify the error
|
||||
that occurred.
|
||||
|
||||
Multiprocessing is currently not supported in this implementation.
|
||||
|
||||
sem_open - Open a named semaphore
|
||||
---------------------------------
|
||||
.. index:: sem_open
|
||||
.. index:: open a named semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_open(
|
||||
const char \*name,
|
||||
int oflag
|
||||
);
|
||||
|
||||
**ARGUMENTS:**
|
||||
|
||||
The following flag bit may be set in oflag:
|
||||
|
||||
``O_CREAT`` - Creates the semaphore if it does not already exist. If O_CREAT
|
||||
is set and the semaphore already exists then O_CREAT has no effect. Otherwise,
|
||||
sem_open() creates a semaphore. The O_CREAT flag requires the third and fourth
|
||||
argument: mode and value of type mode_t and unsigned int, respectively.
|
||||
|
||||
``O_EXCL`` - If O_EXCL and O_CREAT are set, all call to sem_open() shall fail
|
||||
if the semaphore name exists
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EACCES*
|
||||
Valid name specified but oflag permissions are denied, or the semaphore name
|
||||
specified does not exist and permission to create the named semaphore is denied.
|
||||
|
||||
*EEXIST*
|
||||
O_CREAT and O_EXCL are set and the named semaphore already exists.
|
||||
|
||||
*EINTR*
|
||||
The sem_open() operation was interrupted by a signal.
|
||||
|
||||
*EINVAL*
|
||||
The sem_open() operation is not supported for the given name.
|
||||
|
||||
*EMFILE*
|
||||
Too many semaphore descriptors or file descriptors in use by this process.
|
||||
|
||||
*ENAMETOOLONG*
|
||||
The length of the name exceed PATH_MAX or name component is longer than NAME_MAX
|
||||
while POSIX_NO_TRUNC is in effect.
|
||||
|
||||
*ENOENT*
|
||||
O_CREAT is not set and the named semaphore does not exist.
|
||||
|
||||
*ENOSPC*
|
||||
There is insufficient space for the creation of a new named semaphore.
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_open() is not supported by this implementation.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_open() function establishes a connection between a specified semaphore and
|
||||
a process. After a call to sem_open with a specified semaphore name, a process
|
||||
can reference to semaphore by the associated name using the address returned by
|
||||
the call. The oflag arguments listed above control the state of the semaphore by
|
||||
determining if the semaphore is created or accessed by a call to sem_open().
|
||||
|
||||
**NOTES:**
|
||||
|
||||
sem_close - Close a named semaphore
|
||||
-----------------------------------
|
||||
.. index:: sem_close
|
||||
.. index:: close a named semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_close(
|
||||
sem_t \*sem_close
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EACCES*
|
||||
The semaphore argument is not a valid semaphore descriptor.
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_close is not supported by this implementation.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_close() function is used to indicate that the calling process is finished
|
||||
using the named semaphore indicated by sem. The function sem_close deallocates
|
||||
any system resources that were previously allocated by a sem_open system call. If
|
||||
sem_close() completes successfully it returns a 1, otherwise a value of -1 is
|
||||
return and errno is set.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
sem_unlink - Unlink a semaphore
|
||||
-------------------------------
|
||||
.. index:: sem_unlink
|
||||
.. index:: unlink a semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_unlink(
|
||||
const char \*name
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EACCESS*
|
||||
Permission is denied to unlink a semaphore.
|
||||
|
||||
*ENAMETOOLONG*
|
||||
The length of the strong name exceed NAME_MAX while POSIX_NO_TRUNC is in effect.
|
||||
|
||||
*ENOENT*
|
||||
The name of the semaphore does not exist.
|
||||
|
||||
*ENOSPC*
|
||||
There is insufficient space for the creation of a new named semaphore.
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_unlink is not supported by this implementation.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_unlink() function shall remove the semaphore name by the string name. If
|
||||
a process is currently accessing the name semaphore, the sem_unlink command has
|
||||
no effect. If one or more processes have the semaphore open when the sem_unlink
|
||||
function is called, the destruction of semaphores shall be postponed until all
|
||||
reference to semaphore are destroyed by calls to sem_close, _exit(), or exec.
|
||||
After all references have been destroyed, it returns immediately.
|
||||
|
||||
If the termination is successful, the function shall return 0. Otherwise, a -1
|
||||
is returned and the errno is set.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
sem_wait - Wait on a Semaphore
|
||||
------------------------------
|
||||
.. index:: sem_wait
|
||||
.. index:: wait on a semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_wait(
|
||||
sem_t \*sem
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The "sem" argument does not refer to a valid semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function attempts to lock a semaphore specified by ``sem``. If the
|
||||
semaphore is available, then the semaphore is locked (i.e., the semaphore
|
||||
value is decremented). If the semaphore is unavailable (i.e., the semaphore
|
||||
value is zero), then the function will block until the semaphore becomes
|
||||
available. It will then successfully lock the semaphore. The semaphore
|
||||
remains locked until released by a ``sem_post()`` call.
|
||||
|
||||
If the call is unsuccessful, then the function returns -1 and sets errno to the
|
||||
appropriate error code.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Multiprocessing is not supported in this implementation.
|
||||
|
||||
sem_trywait - Non-blocking Wait on a Semaphore
|
||||
----------------------------------------------
|
||||
.. index:: sem_trywait
|
||||
.. index:: non
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_trywait(
|
||||
sem_t \*sem
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EAGAIN*
|
||||
The semaphore is not available (i.e., the semaphore value is zero), so the
|
||||
semaphore could not be locked.
|
||||
|
||||
*EINVAL*
|
||||
The ``sem`` argument does not refewr to a valid semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function attempts to lock a semaphore specified by ``sem``. If the
|
||||
semaphore is available, then the semaphore is locked (i.e., the semaphore
|
||||
value is decremented) and the function returns a value of 0. The semaphore
|
||||
remains locked until released by a ``sem_post()`` call. If the semaphore
|
||||
is unavailable (i.e., the semaphore value is zero), then the function will
|
||||
return a value of -1 immediately and set ``errno`` to EAGAIN.
|
||||
|
||||
If the call is unsuccessful, then the function returns -1 and sets``errno`` to the appropriate error code.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Multiprocessing is not supported in this implementation.
|
||||
|
||||
sem_timedwait - Wait on a Semaphore for a Specified Time
|
||||
--------------------------------------------------------
|
||||
.. index:: sem_timedwait
|
||||
.. index:: wait on a semaphore for a specified time
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_timedwait(
|
||||
sem_t \*sem,
|
||||
const struct timespec \*abstime
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EAGAIN*
|
||||
The semaphore is not available (i.e., the semaphore value is zero), so the
|
||||
semaphore could not be locked.
|
||||
|
||||
*EINVAL*
|
||||
The ``sem`` argument does not refewr to a valid semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function attemtps to lock a semaphore specified by ``sem``,
|
||||
and will wait for the semaphore until the absolute time specified by``abstime``. If the semaphore is available, then the semaphore is
|
||||
locked (i.e., the semaphore value is decremented) and the function
|
||||
returns a value of 0. The semaphore remains locked until released by
|
||||
a ``sem_post()`` call. If the semaphore is unavailable, then the
|
||||
function will wait for the semaphore to become available for the amount
|
||||
of time specified by ``timeout``.
|
||||
|
||||
If the semaphore does not become available within the interval specified by``timeout``, then the function returns -1 and sets ``errno`` to EAGAIN.
|
||||
If any other error occurs, the function returns -1 and sets ``errno`` to
|
||||
the appropriate error code.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Multiprocessing is not supported in this implementation.
|
||||
|
||||
sem_post - Unlock a Semaphore
|
||||
-----------------------------
|
||||
.. index:: sem_post
|
||||
.. index:: unlock a semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_post(
|
||||
sem_t \*sem
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The ``sem`` argument does not refer to a valid semaphore
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function attempts to release the semaphore specified by ``sem``. If
|
||||
other tasks are waiting on the semaphore, then one of those tasks (which one
|
||||
depends on the scheduler being used) is allowed to lock the semaphore and
|
||||
return from its ``sem_wait()``, ``sem_trywait()``, or``sem_timedwait()`` call. If there are no other tasks waiting on the
|
||||
semaphore, then the semaphore value is simply incremented. ``sem_post()``
|
||||
returns 0 upon successful completion.
|
||||
|
||||
If an error occurs, the function returns -1 and sets ``errno`` to the
|
||||
appropriate error code.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Multiprocessing is not supported in this implementation.
|
||||
|
||||
sem_getvalue - Get the value of a semaphore
|
||||
-------------------------------------------
|
||||
.. index:: sem_getvalue
|
||||
.. index:: get the value of a semaphore
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int sem_getvalue(
|
||||
sem_t \*sem,
|
||||
int \*sval
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*EINVAL*
|
||||
The "sem" argument does not refer to a valid semaphore
|
||||
|
||||
*ENOSYS*
|
||||
The function sem_getvalue is not supported by this implementation
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The sem_getvalue functions sets the location referenced by the "sval" argument
|
||||
to the value of the semaphore without affecting the state of the semaphore. The
|
||||
updated value represents a semaphore value that occurred at some point during
|
||||
the call, but is not necessarily the actual value of the semaphore when it
|
||||
returns to the calling process.
|
||||
|
||||
If "sem" is locked, the value returned by sem_getvalue will be zero or a
|
||||
negative number whose absolute value is the number of processes waiting for the
|
||||
semaphore at some point during the call.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If the functions completes successfully, it shall return a value of zero.
|
||||
Otherwise, it shall return a value of -1 and set "errno" to specify the error
|
||||
that occurred.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1989-2008.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
433
posix_users/services_provided_by_c.rst
Normal file
433
posix_users/services_provided_by_c.rst
Normal file
@ -0,0 +1,433 @@
|
||||
Services Provided by C Library (libc)
|
||||
#####################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This section lists the routines that provided by the Newlib C Library.
|
||||
|
||||
Standard Utility Functions (stdlib.h)
|
||||
=====================================
|
||||
|
||||
- ``abort`` - Abnormal termination of a program
|
||||
|
||||
- ``abs`` - Integer absolute value (magnitude)
|
||||
|
||||
- ``assert`` - Macro for Debugging Diagnostics
|
||||
|
||||
- ``atexit`` - Request execution of functions at program exit
|
||||
|
||||
- ``atof`` - String to double or float
|
||||
|
||||
- ``atoi`` - String to integer
|
||||
|
||||
- ``bsearch`` - Binary search
|
||||
|
||||
- ``calloc`` - Allocate space for arrays
|
||||
|
||||
- ``div`` - Divide two integers
|
||||
|
||||
- ``ecvtbuf`` - Double or float to string of digits
|
||||
|
||||
- ``ecvt`` - Double or float to string of digits (malloc result)
|
||||
|
||||
- ``__env_lock`` - Lock environment list for getenv and setenv
|
||||
|
||||
- ``gvcvt`` - Format double or float as string
|
||||
|
||||
- ``exit`` - End program execution
|
||||
|
||||
- ``getenv`` - Look up environment variable
|
||||
|
||||
- ``labs`` - Long integer absolute value (magnitude)
|
||||
|
||||
- ``ldiv`` - Divide two long integers
|
||||
|
||||
- ``malloc`` - Allocate memory
|
||||
|
||||
- ``realloc`` - Reallocate memory
|
||||
|
||||
- ``free`` - Free previously allocated memory
|
||||
|
||||
- ``mallinfo`` - Get information about allocated memory
|
||||
|
||||
- ``__malloc_lock`` - Lock memory pool for malloc and free
|
||||
|
||||
- ``mbstowcs`` - Minimal multibyte string to wide string converter
|
||||
|
||||
- ``mblen`` - Minimal multibyte length
|
||||
|
||||
- ``mbtowc`` - Minimal multibyte to wide character converter
|
||||
|
||||
- ``qsort`` - Sort an array
|
||||
|
||||
- ``rand`` - Pseudo-random numbers
|
||||
|
||||
- ``strtod`` - String to double or float
|
||||
|
||||
- ``strtol`` - String to long
|
||||
|
||||
- ``strtoul`` - String to unsigned long
|
||||
|
||||
- ``system`` - Execute command string
|
||||
|
||||
- ``wcstombs`` - Minimal wide string to multibyte string converter
|
||||
|
||||
- ``wctomb`` - Minimal wide character to multibyte converter
|
||||
|
||||
Character Type Macros and Functions (ctype.h)
|
||||
=============================================
|
||||
|
||||
- ``isalnum`` - Alphanumeric character predicate
|
||||
|
||||
- ``isalpha`` - Alphabetic character predicate
|
||||
|
||||
- ``isascii`` - ASCII character predicate
|
||||
|
||||
- ``iscntrl`` - Control character predicate
|
||||
|
||||
- ``isdigit`` - Decimal digit predicate
|
||||
|
||||
- ``islower`` - Lower-case character predicate
|
||||
|
||||
- ``isprint`` - Printable character predicates (isprint, isgraph)
|
||||
|
||||
- ``ispunct`` - Punctuation character predicate
|
||||
|
||||
- ``isspace`` - Whitespace character predicate
|
||||
|
||||
- ``isupper`` - Uppercase character predicate
|
||||
|
||||
- ``isxdigit`` - Hexadecimal digit predicate
|
||||
|
||||
- ``toascii`` - Force integers to ASCII range
|
||||
|
||||
- ``tolower`` - Translate characters to lower case
|
||||
|
||||
- ``toupper`` - Translate characters to upper case
|
||||
|
||||
Input and Output (stdio.h)
|
||||
==========================
|
||||
|
||||
- ``clearerr`` - Clear file or stream error indicator
|
||||
|
||||
- ``fclose`` - Close a file
|
||||
|
||||
- ``feof`` - Test for end of file
|
||||
|
||||
- ``ferror`` - Test whether read/write error has occurred
|
||||
|
||||
- ``fflush`` - Flush buffered file output
|
||||
|
||||
- ``fgetc`` - Get a character from a file or stream
|
||||
|
||||
- ``fgetpos`` - Record position in a stream or file
|
||||
|
||||
- ``fgets`` - Get character string from a file or stream
|
||||
|
||||
- ``fiprintf`` - Write formatted output to file (integer only)
|
||||
|
||||
- ``fopen`` - Open a file
|
||||
|
||||
- ``fdopen`` - Turn an open file into a stream
|
||||
|
||||
- ``fputc`` - Write a character on a stream or file
|
||||
|
||||
- ``fputs`` - Write a character string in a file or stream
|
||||
|
||||
- ``fread`` - Read array elements from a file
|
||||
|
||||
- ``freopen`` - Open a file using an existing file descriptor
|
||||
|
||||
- ``fseek`` - Set file position
|
||||
|
||||
- ``fsetpos`` - Restore position of a stream or file
|
||||
|
||||
- ``ftell`` - Return position in a stream or file
|
||||
|
||||
- ``fwrite`` - Write array elements from memory to a file or stream
|
||||
|
||||
- ``getc`` - Get a character from a file or stream (macro)
|
||||
|
||||
- ``getchar`` - Get a character from standard input (macro)
|
||||
|
||||
- ``gets`` - Get character string from standard input (obsolete)
|
||||
|
||||
- ``iprintf`` - Write formatted output (integer only)
|
||||
|
||||
- ``mktemp`` - Generate unused file name
|
||||
|
||||
- ``perror`` - Print an error message on standard error
|
||||
|
||||
- ``putc`` - Write a character on a stream or file (macro)
|
||||
|
||||
- ``putchar`` - Write a character on standard output (macro)
|
||||
|
||||
- ``puts`` - Write a character string on standard output
|
||||
|
||||
- ``remove`` - Delete a file’s name
|
||||
|
||||
- ``rename`` - Rename a file
|
||||
|
||||
- ``rewind`` - Reinitialize a file or stream
|
||||
|
||||
- ``setbuf`` - Specify full buffering for a file or stream
|
||||
|
||||
- ``setvbuf`` - Specify buffering for a file or stream
|
||||
|
||||
- ``siprintf`` - Write formatted output (integer only)
|
||||
|
||||
- ``printf`` - Write formatted output
|
||||
|
||||
- ``scanf`` - Scan and format input
|
||||
|
||||
- ``tmpfile`` - Create a temporary file
|
||||
|
||||
- ``tmpnam`` - Generate name for a temporary file
|
||||
|
||||
- ``vprintf`` - Format variable argument list
|
||||
|
||||
Strings and Memory (string.h)
|
||||
=============================
|
||||
|
||||
- ``bcmp`` - Compare two memory areas
|
||||
|
||||
- ``bcopy`` - Copy memory regions
|
||||
|
||||
- ``bzero`` - Initialize memory to zero
|
||||
|
||||
- ``index`` - Search for character in string
|
||||
|
||||
- ``memchr`` - Find character in memory
|
||||
|
||||
- ``memcmp`` - Compare two memory areas
|
||||
|
||||
- ``memcpy`` - Copy memory regions
|
||||
|
||||
- ``memmove`` - Move possibly overlapping memory
|
||||
|
||||
- ``memset`` - Set an area of memory
|
||||
|
||||
- ``rindex`` - Reverse search for character in string
|
||||
|
||||
- ``strcasecmp`` - Compare strings ignoring case
|
||||
|
||||
- ``strcat`` - Concatenate strings
|
||||
|
||||
- ``strchr`` - Search for character in string
|
||||
|
||||
- ``strcmp`` - Character string compare
|
||||
|
||||
- ``strcoll`` - Locale specific character string compare
|
||||
|
||||
- ``strcpy`` - Copy string
|
||||
|
||||
- ``strcspn`` - Count chars not in string
|
||||
|
||||
- ``strerror`` - Convert error number to string
|
||||
|
||||
- ``strlen`` - Character string length
|
||||
|
||||
- ``strlwr`` - Convert string to lower case
|
||||
|
||||
- ``strncasecmp`` - Compare strings ignoring case
|
||||
|
||||
- ``strncat`` - Concatenate strings
|
||||
|
||||
- ``strncmp`` - Character string compare
|
||||
|
||||
- ``strncpy`` - Counted copy string
|
||||
|
||||
- ``strpbrk`` - Find chars in string
|
||||
|
||||
- ``strrchr`` - Reverse search for character in string
|
||||
|
||||
- ``strspn`` - Find initial match
|
||||
|
||||
- ``strstr`` - Find string segment
|
||||
|
||||
- ``strtok`` - Get next token from a string
|
||||
|
||||
- ``strupr`` - Convert string to upper case
|
||||
|
||||
- ``strxfrm`` - Transform string
|
||||
|
||||
Signal Handling (signal.h)
|
||||
==========================
|
||||
|
||||
- ``raise`` - Send a signal
|
||||
|
||||
- ``signal`` - Specify handler subroutine for a signal
|
||||
|
||||
Time Functions (time.h)
|
||||
=======================
|
||||
|
||||
- ``asctime`` - Format time as string
|
||||
|
||||
- ``clock`` - Cumulative processor time
|
||||
|
||||
- ``ctime`` - Convert time to local and format as string
|
||||
|
||||
- ``difftime`` - Subtract two times
|
||||
|
||||
- ``gmtime`` - Convert time to UTC (GMT) traditional representation
|
||||
|
||||
- ``localtime`` - Convert time to local representation
|
||||
|
||||
- ``mktime`` - Convert time to arithmetic representation
|
||||
|
||||
- ``strftime`` - Flexible calendar time formatter
|
||||
|
||||
- ``time`` - Get current calendar time (as single number)
|
||||
|
||||
Locale (locale.h)
|
||||
=================
|
||||
|
||||
- ``setlocale`` - Select or query locale
|
||||
|
||||
Reentrant Versions of Functions
|
||||
===============================
|
||||
|
||||
- Equivalent for errno variable:
|
||||
- ``errno_r`` - XXX
|
||||
|
||||
- Locale functions:
|
||||
- ``localeconv_r`` - XXX
|
||||
- ``setlocale_r`` - XXX
|
||||
|
||||
- Equivalents for stdio variables:
|
||||
- ``stdin_r`` - XXX
|
||||
- ``stdout_r`` - XXX
|
||||
- ``stderr_r`` - XXX
|
||||
|
||||
- Stdio functions:
|
||||
- ``fdopen_r`` - XXX
|
||||
- ``perror_r`` - XXX
|
||||
- ``tempnam_r`` - XXX
|
||||
- ``fopen_r`` - XXX
|
||||
- ``putchar_r`` - XXX
|
||||
- ``tmpnam_r`` - XXX
|
||||
- ``getchar_r`` - XXX
|
||||
- ``puts_r`` - XXX
|
||||
- ``tmpfile_r`` - XXX
|
||||
- ``gets_r`` - XXX
|
||||
- ``remove_r`` - XXX
|
||||
- ``vfprintf_r`` - XXX
|
||||
- ``iprintf_r`` - XXX
|
||||
- ``rename_r`` - XXX
|
||||
- ``vsnprintf_r`` - XXX
|
||||
- ``mkstemp_r`` - XXX
|
||||
- ``snprintf_r`` - XXX
|
||||
- ``vsprintf_r`` - XXX
|
||||
- ``mktemp_t`` - XXX
|
||||
- ``sprintf_r`` - XXX
|
||||
|
||||
- Signal functions:
|
||||
- ``init_signal_r`` - XXX
|
||||
- ``signal_r`` - XXX
|
||||
- ``kill_r`` - XXX
|
||||
- ``_sigtramp_r`` - XXX
|
||||
- ``raise_r`` - XXX
|
||||
|
||||
- Stdlib functions:
|
||||
- ``calloc_r`` - XXX
|
||||
- ``mblen_r`` - XXX
|
||||
- ``srand_r`` - XXX
|
||||
- ``dtoa_r`` - XXX
|
||||
- ``mbstowcs_r`` - XXX
|
||||
- ``strtod_r`` - XXX
|
||||
- ``free_r`` - XXX
|
||||
- ``mbtowc_r`` - XXX
|
||||
- ``strtol_r`` - XXX
|
||||
- ``getenv_r`` - XXX
|
||||
- ``memalign_r`` - XXX
|
||||
- ``strtoul_r`` - XXX
|
||||
- ``mallinfo_r`` - XXX
|
||||
- ``mstats_r`` - XXX
|
||||
- ``system_r`` - XXX
|
||||
- ``malloc_r`` - XXX
|
||||
- ``rand_r`` - XXX
|
||||
- ``wcstombs_r`` - XXX
|
||||
- ``malloc_r`` - XXX
|
||||
- ``realloc_r`` - XXX
|
||||
- ``wctomb_r`` - XXX
|
||||
- ``malloc_stats_r`` - XXX
|
||||
- ``setenv_r`` - XXX
|
||||
|
||||
- String functions:
|
||||
- ``strtok_r`` - XXX
|
||||
|
||||
- System functions:
|
||||
- ``close_r`` - XXX
|
||||
- ``link_r`` - XXX
|
||||
- ``unlink_r`` - XXX
|
||||
- ``execve_r`` - XXX
|
||||
- ``lseek_r`` - XXX
|
||||
- ``wait_r`` - XXX
|
||||
- ``fcntl_r`` - XXX
|
||||
- ``open_r`` - XXX
|
||||
- ``write_r`` - XXX
|
||||
- ``fork_r`` - XXX
|
||||
- ``read_r`` - XXX
|
||||
- ``fstat_r`` - XXX
|
||||
- ``sbrk_r`` - XXX
|
||||
- ``gettimeofday_r`` - XXX
|
||||
- ``stat_r`` - XXX
|
||||
- ``getpid_r`` - XXX
|
||||
- ``times_r`` - XXX
|
||||
|
||||
- Time function:
|
||||
- ``asctime_r`` - XXX
|
||||
|
||||
Miscellaneous Macros and Functions
|
||||
==================================
|
||||
|
||||
- ``unctrl`` - Return printable representation of a character
|
||||
|
||||
Variable Argument Lists
|
||||
=======================
|
||||
|
||||
- Stdarg (stdarg.h):
|
||||
- ``va_start`` - XXX
|
||||
- ``va_arg`` - XXX
|
||||
- ``va_end`` - XXX
|
||||
|
||||
- Vararg (varargs.h):
|
||||
- ``va_alist`` - XXX
|
||||
- ``va_start-trad`` - XXX
|
||||
- ``va_arg-trad`` - XXX
|
||||
- ``va_end-trad`` - XXX
|
||||
|
||||
Reentrant System Calls
|
||||
======================
|
||||
|
||||
- ``open_r`` - XXX
|
||||
|
||||
- ``close_r`` - XXX
|
||||
|
||||
- ``lseek_r`` - XXX
|
||||
|
||||
- ``read_r`` - XXX
|
||||
|
||||
- ``write_r`` - XXX
|
||||
|
||||
- ``fork_r`` - XXX
|
||||
|
||||
- ``wait_r`` - XXX
|
||||
|
||||
- ``stat_r`` - XXX
|
||||
|
||||
- ``fstat_r`` - XXX
|
||||
|
||||
- ``link_r`` - XXX
|
||||
|
||||
- ``unlink_r`` - XXX
|
||||
|
||||
- ``sbrk_r`` - XXX
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
96
posix_users/services_provided_by_math.rst
Normal file
96
posix_users/services_provided_by_math.rst
Normal file
@ -0,0 +1,96 @@
|
||||
Services Provided by the Math Library (libm)
|
||||
############################################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This section lists the routines that provided by the Newlib Math Library
|
||||
(libm).
|
||||
|
||||
Standard Math Functions (math.h)
|
||||
================================
|
||||
|
||||
- ``acos`` - Arccosine
|
||||
|
||||
- ``acosh`` - Inverse hyperbolic cosine
|
||||
|
||||
- ``asin`` - Arcsine
|
||||
|
||||
- ``asinh`` - Inverse hyperbolic sine
|
||||
|
||||
- ``atan`` - Arctangent
|
||||
|
||||
- ``atan2`` - Arctangent of y/x
|
||||
|
||||
- ``atanh`` - Inverse hyperbolic tangent
|
||||
|
||||
- ``jN`` - Bessel functions (jN and yN)
|
||||
|
||||
- ``cbrt`` - Cube root
|
||||
|
||||
- ``copysign`` - Sign of Y and magnitude of X
|
||||
|
||||
- ``cosh`` - Hyperbolic cosine
|
||||
|
||||
- ``erf`` - Error function (erf and erfc)
|
||||
|
||||
- ``exp`` - Exponential
|
||||
|
||||
- ``expm1`` - Exponential of x and - 1
|
||||
|
||||
- ``fabs`` - Absolute value (magnitude)
|
||||
|
||||
- ``floor`` - Floor and ceiling (floor and ceil)
|
||||
|
||||
- ``fmod`` - Floating-point remainder (modulo)
|
||||
|
||||
- ``frexp`` - Split floating-point number
|
||||
|
||||
- ``gamma`` - Logarithmic gamma function
|
||||
|
||||
- ``hypot`` - Distance from origin
|
||||
|
||||
- ``ilogb`` - Get exponent
|
||||
|
||||
- ``infinity`` - Floating infinity
|
||||
|
||||
- ``isnan`` - Check type of number
|
||||
|
||||
- ``ldexp`` - Load exponent
|
||||
|
||||
- ``log`` - Natural logarithms
|
||||
|
||||
- ``log10`` - Base 10 logarithms
|
||||
|
||||
- ``log1p`` - Log of 1 + X
|
||||
|
||||
- ``matherr`` - Modifiable math error handler
|
||||
|
||||
- ``modf`` - Split fractional and integer parts
|
||||
|
||||
- ``nan`` - Floating Not a Number
|
||||
|
||||
- ``nextafter`` - Get next representable number
|
||||
|
||||
- ``pow`` - X to the power Y
|
||||
|
||||
- ``remainder`` - remainder of X divided by Y
|
||||
|
||||
- ``scalbn`` - scalbn
|
||||
|
||||
- ``sin`` - Sine or cosine (sin and cos)
|
||||
|
||||
- ``sinh`` - Hyperbolic sine
|
||||
|
||||
- ``sqrt`` - Positive square root
|
||||
|
||||
- ``tan`` - Tangent
|
||||
|
||||
- ``tanh`` - Hyperbolic tangent
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
890
posix_users/signal.rst
Normal file
890
posix_users/signal.rst
Normal file
@ -0,0 +1,890 @@
|
||||
Signal Manager
|
||||
##############
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The signal manager provides the functionality associated with
|
||||
the generation, delivery, and management of process-oriented
|
||||
signals.
|
||||
|
||||
The directives provided by the signal manager are:
|
||||
|
||||
- ``sigaddset`` - Add a Signal to a Signal Set
|
||||
|
||||
- ``sigdelset`` - Delete a Signal from a Signal Set
|
||||
|
||||
- ``sigfillset`` - Fill a Signal Set
|
||||
|
||||
- ``sigismember`` - Is Signal a Member of a Signal Set
|
||||
|
||||
- ``sigemptyset`` - Empty a Signal Set
|
||||
|
||||
- ``sigaction`` - Examine and Change Signal Action
|
||||
|
||||
- ``pthread_kill`` - Send a Signal to a Thread
|
||||
|
||||
- ``sigprocmask`` - Examine and Change Process Blocked Signals
|
||||
|
||||
- ``pthread_sigmask`` - Examine and Change Thread Blocked Signals
|
||||
|
||||
- ``kill`` - Send a Signal to a Process
|
||||
|
||||
- ``sigpending`` - Examine Pending Signals
|
||||
|
||||
- ``sigsuspend`` - Wait for a Signal
|
||||
|
||||
- ``pause`` - Suspend Process Execution
|
||||
|
||||
- ``sigwait`` - Synchronously Accept a Signal
|
||||
|
||||
- ``sigwaitinfo`` - Synchronously Accept a Signal
|
||||
|
||||
- ``sigtimedwait`` - Synchronously Accept a Signal with Timeout
|
||||
|
||||
- ``sigqueue`` - Queue a Signal to a Process
|
||||
|
||||
- ``alarm`` - Schedule Alarm
|
||||
|
||||
- ``ualarm`` - Schedule Alarm in Microseconds
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Signals
|
||||
-------
|
||||
|
||||
POSIX signals are an asynchronous event mechanism. Each process
|
||||
and thread has a set of signals associated with it. Individual
|
||||
signals may be enabled (e.g. unmasked) or blocked (e.g. ignored)
|
||||
on both a per-thread and process level. Signals which are
|
||||
enabled have a signal handler associated with them. When the
|
||||
signal is generated and conditions are met, then the signal
|
||||
handler is invoked in the proper process or thread context
|
||||
asynchronous relative to the logical thread of execution.
|
||||
|
||||
If a signal has been blocked when it is generated, then it
|
||||
is queued and kept pending until the thread or process unblocks
|
||||
the signal or explicitly checks for it.
|
||||
Traditional, non-real-time POSIX signals do not queue. Thus
|
||||
if a process or thread has blocked a particular signal, then
|
||||
multiple occurrences of that signal are recorded as a
|
||||
single occurrence of that signal.
|
||||
|
||||
.. COMMENT: TODO: SIGRTMIN and SIGRTMAX ?
|
||||
|
||||
One can check for the set of outstanding signals that have been
|
||||
blocked. Services are provided to check for outstanding process
|
||||
or thread directed signals.
|
||||
|
||||
Signal Delivery
|
||||
---------------
|
||||
|
||||
Signals which are directed at a thread are delivered to the specified thread.
|
||||
|
||||
Signals which are directed at a process are delivered to a thread which
|
||||
is selected based on the following algorithm:
|
||||
|
||||
# If the action for this signal is currently ``SIG_IGN``,
|
||||
then the signal is simply ignored.
|
||||
|
||||
# If the currently executing thread has the signal unblocked, then
|
||||
the signal is delivered to it.
|
||||
|
||||
# If any threads are currently blocked waiting for this signal
|
||||
(``sigwait()``), then the signal is delivered to the highest priority
|
||||
thread waiting for this signal.
|
||||
|
||||
# If any other threads are willing to accept delivery of the signal, then
|
||||
the signal is delivered to the highest priority thread of this set. In the
|
||||
event, multiple threads of the same priority are willing to accept this
|
||||
signal, then priority is given first to ready threads, then to threads
|
||||
blocked on calls which may be interrupted, and finally to threads blocked
|
||||
on non-interruptible calls.
|
||||
|
||||
# In the event the signal still can not be delivered, then it is left
|
||||
pending. The first thread to unblock the signal (``sigprocmask()`` or``pthread_sigprocmask()``) or to wait for this signal
|
||||
(``sigwait()``) will be the recipient of the signal.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
Signal Set Management
|
||||
---------------------
|
||||
|
||||
Each process and each thread within that process has a set of
|
||||
individual signals and handlers associated with it. Services
|
||||
are provided to construct signal sets for the purposes of building
|
||||
signal sets – type ``sigset_t`` – that are used to
|
||||
provide arguments to the services that mask, unmask, and
|
||||
check on pending signals.
|
||||
|
||||
Blocking Until Signal Generation
|
||||
--------------------------------
|
||||
|
||||
A thread may block until receipt of a signal. The "sigwait"
|
||||
and "pause" families of functions block until the requested
|
||||
signal is received or if using ``sigtimedwait()`` until the specified
|
||||
timeout period has elapsed.
|
||||
|
||||
Sending a Signal
|
||||
----------------
|
||||
|
||||
This is accomplished
|
||||
via one of a number of services that sends a signal to either a
|
||||
process or thread. Signals may be directed at a process by
|
||||
the service ``kill()`` or at a thread by the service``pthread_kill()``
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the signal manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
sigaddset - Add a Signal to a Signal Set
|
||||
----------------------------------------
|
||||
.. index:: sigaddset
|
||||
.. index:: add a signal to a signal set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigaddset(
|
||||
sigset_t \*set,
|
||||
int signo
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function adds the signal ``signo`` to the specified signal ``set``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The set must be initialized using either ``sigemptyset`` or ``sigfillset``
|
||||
before using this function.
|
||||
|
||||
sigdelset - Delete a Signal from a Signal Set
|
||||
---------------------------------------------
|
||||
.. index:: sigdelset
|
||||
.. index:: delete a signal from a signal set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigdelset(
|
||||
sigset_t \*set,
|
||||
int signo
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function deletes the signal specified by ``signo`` from the specified
|
||||
signal ``set``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The set must be initialized using either ``sigemptyset`` or ``sigfillset``
|
||||
before using this function.
|
||||
|
||||
sigfillset - Fill a Signal Set
|
||||
------------------------------
|
||||
.. index:: sigfillset
|
||||
.. index:: fill a signal set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigfillset(
|
||||
sigset_t \*set
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function fills the specified signal ``set`` such that all
|
||||
signals are set.
|
||||
|
||||
sigismember - Is Signal a Member of a Signal Set
|
||||
------------------------------------------------
|
||||
.. index:: sigismember
|
||||
.. index:: is signal a member of a signal set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigismember(
|
||||
const sigset_t \*set,
|
||||
int signo
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns either 1 or 0 if completed successfully, otherwise it
|
||||
returns -1 and sets ``errno`` to indicate the error. ``errno`` may be set
|
||||
to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function returns returns 1 if ``signo`` is a member of ``set``
|
||||
and 0 otherwise.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The set must be initialized using either ``sigemptyset`` or ``sigfillset``
|
||||
before using this function.
|
||||
|
||||
sigemptyset - Empty a Signal Set
|
||||
--------------------------------
|
||||
.. index:: sigemptyset
|
||||
.. index:: empty a signal set
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigemptyset(
|
||||
sigset_t \*set
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function initializes an empty signal set pointed to by ``set``.
|
||||
|
||||
sigaction - Examine and Change Signal Action
|
||||
--------------------------------------------
|
||||
.. index:: sigaction
|
||||
.. index:: examine and change signal action
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigaction(
|
||||
int sig,
|
||||
const struct sigaction \*act,
|
||||
struct sigaction \*oact
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
*ENOTSUP*
|
||||
Realtime Signals Extension option not supported.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
If the argument act is not a null pointer, it points to a structure specifying
|
||||
the action to be associated with the specified signal. If the argument oact is
|
||||
not a null pointer, the action previously associated with the signal is stored
|
||||
in the location pointed to by the argument oact. If the argument act is a null
|
||||
pointer, signal handling is unchanged; thus, the call can be used to enquire
|
||||
about the current handling of a given signal.
|
||||
|
||||
The structure ``sigaction`` has the following members:
|
||||
|
||||
``void(\*)(int) sa_handler``
|
||||
Pointer to a signal-catching function or one of the macros SIG_IGN or SIG_DFL.
|
||||
|
||||
``sigset_t sa_mask``
|
||||
Additional set of signals to be blocked during execution of signal-catching function.
|
||||
|
||||
``int sa_flags``
|
||||
Special flags to affect behavior of signal.
|
||||
|
||||
``void(\*)(int, siginfo_t*, void*) sa_sigaction``
|
||||
Alternative pointer to a signal-catching function.
|
||||
|
||||
``sa_handler`` and ``sa_sigaction`` should never be used at the same time as their storage may overlap.
|
||||
|
||||
If the ``SA_SIGINFO`` flag (see below) is set in ``sa_flags``, the``sa_sigaction`` field specifies a signal-catching function, otherwise``sa_handler`` specifies the action to be associated with the signal, which
|
||||
may be a signal-catching function or one of the macros ``SIG_IGN`` or``SIG_DFN``.
|
||||
|
||||
The following flags can be set in the ``sa_flags`` field:
|
||||
|
||||
``SA_SIGINFO``
|
||||
If not set, the signal-catching function should be declared as ``void
|
||||
func(int signo)`` and the address of the function should be set in``sa_handler``. If set, the signal-catching function should be declared as``void func(int signo, siginfo_t* info, void* context)`` and the address of
|
||||
the function should be set in ``sa_sigaction``.
|
||||
|
||||
The prototype of the ``siginfo_t`` structure is the following:
|
||||
.. code:: c
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int si_signo; /* Signal number \*/
|
||||
int si_code; /* Cause of the signal \*/
|
||||
pid_t si_pid; /* Sending process ID \*/
|
||||
uid_t si_uid; /* Real user ID of sending process \*/
|
||||
void* si_addr; /* Address of faulting instruction \*/
|
||||
int si_status; /* Exit value or signal \*/
|
||||
union sigval
|
||||
{
|
||||
int sival_int; /* Integer signal value \*/
|
||||
void* sival_ptr; /* Pointer signal value \*/
|
||||
} si_value; /* Signal value \*/
|
||||
}
|
||||
|
||||
**NOTES:**
|
||||
|
||||
The signal number cannot be SIGKILL.
|
||||
|
||||
pthread_kill - Send a Signal to a Thread
|
||||
----------------------------------------
|
||||
.. index:: pthread_kill
|
||||
.. index:: send a signal to a thread
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int pthread_kill(
|
||||
pthread_t thread,
|
||||
int sig
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*ESRCH*
|
||||
The thread indicated by the parameter thread is invalid.
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This functions sends the specified signal ``sig`` to a thread referenced
|
||||
to by ``thread``.
|
||||
|
||||
If the signal code is ``0``, arguments are validated and no signal is sent.
|
||||
|
||||
sigprocmask - Examine and Change Process Blocked Signals
|
||||
--------------------------------------------------------
|
||||
.. index:: sigprocmask
|
||||
.. index:: examine and change process blocked signals
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigprocmask(
|
||||
int how,
|
||||
const sigset_t \*set,
|
||||
sigset_t \*oset
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function is used to alter the set of currently blocked signals
|
||||
on a process wide basis. A blocked signal will not be received by the
|
||||
process. The behavior of this function is dependent on the value of``how`` which may be one of the following:
|
||||
|
||||
``SIG_BLOCK``
|
||||
The set of blocked signals is set to the union of ``set`` and
|
||||
those signals currently blocked.
|
||||
|
||||
``SIG_UNBLOCK``
|
||||
The signals specific in ``set`` are removed from the currently
|
||||
blocked set.
|
||||
|
||||
``SIG_SETMASK``
|
||||
The set of currently blocked signals is set to ``set``.
|
||||
|
||||
If ``oset`` is not ``NULL``, then the set of blocked signals prior to
|
||||
this call is returned in ``oset``. If ``set`` is *NULL*, no change is
|
||||
done, allowing to examine the set of currently blocked signals.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
It is not an error to unblock a signal which is not blocked.
|
||||
|
||||
In the current implementation of RTEMS POSIX API sigprocmask() is technically
|
||||
mapped to pthread_sigmask().
|
||||
|
||||
pthread_sigmask - Examine and Change Thread Blocked Signals
|
||||
-----------------------------------------------------------
|
||||
.. index:: pthread_sigmask
|
||||
.. index:: examine and change thread blocked signals
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int pthread_sigmask(
|
||||
int how,
|
||||
const sigset_t \*set,
|
||||
sigset_t \*oset
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function is used to alter the set of currently blocked signals
|
||||
for the calling thread. A blocked signal will not be received by the
|
||||
process. The behavior of this function is dependent on the value of``how`` which may be one of the following:
|
||||
|
||||
``SIG_BLOCK``
|
||||
The set of blocked signals is set to the union of ``set`` and
|
||||
those signals currently blocked.
|
||||
|
||||
``SIG_UNBLOCK``
|
||||
The signals specific in ``set`` are removed from the currently
|
||||
blocked set.
|
||||
|
||||
``SIG_SETMASK``
|
||||
The set of currently blocked signals is set to ``set``.
|
||||
|
||||
If ``oset`` is not ``NULL``, then the set of blocked signals prior to
|
||||
this call is returned in ``oset``. If ``set`` is *NULL*, no change is
|
||||
done, allowing to examine the set of currently blocked signals.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
It is not an error to unblock a signal which is not blocked.
|
||||
|
||||
kill - Send a Signal to a Process
|
||||
---------------------------------
|
||||
.. index:: kill
|
||||
.. index:: send a signal to a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <signal.h>
|
||||
int kill(
|
||||
pid_t pid,
|
||||
int sig
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
*EPERM*
|
||||
Process does not have permission to send the signal to any receiving process.
|
||||
|
||||
*ESRCH*
|
||||
The process indicated by the parameter pid is invalid.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function sends the signal ``sig`` to the process ``pid``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Since RTEMS is a single-process system, a signal can only be sent to the calling
|
||||
process (i.e. the current node).
|
||||
|
||||
sigpending - Examine Pending Signals
|
||||
------------------------------------
|
||||
.. index:: sigpending
|
||||
.. index:: examine pending signals
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigpending(
|
||||
const sigset_t \*set
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EFAULT*
|
||||
Invalid address for set.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function allows the caller to examine the set of currently pending
|
||||
signals. A pending signal is one which has been raised but is currently
|
||||
blocked. The set of pending signals is returned in ``set``.
|
||||
|
||||
sigsuspend - Wait for a Signal
|
||||
------------------------------
|
||||
.. index:: sigsuspend
|
||||
.. index:: wait for a signal
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigsuspend(
|
||||
const sigset_t \*sigmask
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINTR*
|
||||
Signal interrupted this function.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function temporarily replaces the signal mask for the process
|
||||
with that specified by ``sigmask`` and blocks the calling thread
|
||||
until a signal is raised.
|
||||
|
||||
pause - Suspend Process Execution
|
||||
---------------------------------
|
||||
.. index:: pause
|
||||
.. index:: suspend process execution
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int pause( void );
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINTR*
|
||||
Signal interrupted this function.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function causes the calling thread to be blocked until an
|
||||
unblocked signal is received.
|
||||
|
||||
sigwait - Synchronously Accept a Signal
|
||||
---------------------------------------
|
||||
.. index:: sigwait
|
||||
.. index:: synchronously accept a signal
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigwait(
|
||||
const sigset_t \*set,
|
||||
int \*sig
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINVAL*
|
||||
Invalid argument passed.
|
||||
|
||||
*EINTR*
|
||||
Signal interrupted this function.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function selects a pending signal based on the set specified in``set``, atomically clears it from the set of pending signals, and
|
||||
returns the signal number for that signal in ``sig``.
|
||||
|
||||
sigwaitinfo - Synchronously Accept a Signal
|
||||
-------------------------------------------
|
||||
.. index:: sigwaitinfo
|
||||
.. index:: synchronously accept a signal
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigwaitinfo(
|
||||
const sigset_t \*set,
|
||||
siginfo_t \*info
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EINTR*
|
||||
Signal interrupted this function.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function selects a pending signal based on the set specified in``set``, atomically clears it from the set of pending signals, and
|
||||
returns information about that signal in ``info``.
|
||||
|
||||
The prototype of the ``siginfo_t`` structure is the following:
|
||||
.. code:: c
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int si_signo; /* Signal number \*/
|
||||
int si_code; /* Cause of the signal \*/
|
||||
pid_t si_pid; /* Sending process ID \*/
|
||||
uid_t si_uid; /* Real user ID of sending process \*/
|
||||
void* si_addr; /* Address of faulting instruction \*/
|
||||
int si_status; /* Exit value or signal \*/
|
||||
union sigval
|
||||
{
|
||||
int sival_int; /* Integer signal value \*/
|
||||
void* sival_ptr; /* Pointer signal value \*/
|
||||
} si_value; /* Signal value \*/
|
||||
}
|
||||
|
||||
sigtimedwait - Synchronously Accept a Signal with Timeout
|
||||
---------------------------------------------------------
|
||||
.. index:: sigtimedwait
|
||||
.. index:: synchronously accept a signal with timeout
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigtimedwait(
|
||||
const sigset_t \*set,
|
||||
siginfo_t \*info,
|
||||
const struct timespec \*timeout
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EAGAIN*
|
||||
Timed out while waiting for the specified signal set.
|
||||
|
||||
*EINVAL*
|
||||
Nanoseconds field of the timeout argument is invalid.
|
||||
|
||||
*EINTR*
|
||||
Signal interrupted this function.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function selects a pending signal based on the set specified in``set``, atomically clears it from the set of pending signals, and
|
||||
returns information about that signal in ``info``. The calling thread
|
||||
will block up to ``timeout`` waiting for the signal to arrive.
|
||||
|
||||
The ``timespec`` structure is defined as follows:
|
||||
.. code:: c
|
||||
|
||||
struct timespec
|
||||
{
|
||||
time_t tv_sec; /* Seconds \*/
|
||||
long tv_nsec; /* Nanoseconds \*/
|
||||
}
|
||||
|
||||
**NOTES:**
|
||||
|
||||
If ``timeout`` is NULL, then the calling thread will wait forever for
|
||||
the specified signal set.
|
||||
|
||||
sigqueue - Queue a Signal to a Process
|
||||
--------------------------------------
|
||||
.. index:: sigqueue
|
||||
.. index:: queue a signal to a process
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <signal.h>
|
||||
int sigqueue(
|
||||
pid_t pid,
|
||||
int signo,
|
||||
const union sigval value
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
The function returns 0 on success, otherwise it returns -1 and sets``errno`` to indicate the error. ``errno`` may be set to:
|
||||
|
||||
*EAGAIN*
|
||||
No resources available to queue the signal. The process has already
|
||||
queued SIGQUEUE_MAX signals that are still pending at the receiver
|
||||
or the systemwide resource limit has been exceeded.
|
||||
|
||||
*EINVAL*
|
||||
The value of the signo argument is an invalid or unsupported signal
|
||||
number.
|
||||
|
||||
*EPERM*
|
||||
The process does not have the appropriate privilege to send the signal
|
||||
to the receiving process.
|
||||
|
||||
*ESRCH*
|
||||
The process pid does not exist.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
This function sends the signal specified by ``signo`` to the
|
||||
process ``pid``
|
||||
|
||||
The ``sigval`` union is specified as:
|
||||
.. code:: c
|
||||
|
||||
union sigval
|
||||
{
|
||||
int sival_int; /* Integer signal value \*/
|
||||
void* sival_ptr; /* Pointer signal value \*/
|
||||
}
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Since RTEMS is a single-process system, a signal can only be sent to the calling
|
||||
process (i.e. the current node).
|
||||
|
||||
alarm - Schedule Alarm
|
||||
----------------------
|
||||
.. index:: alarm
|
||||
.. index:: schedule alarm
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
unsigned int alarm(
|
||||
unsigned int seconds
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This call always succeeds.
|
||||
|
||||
If there was a previous ``alarm()`` request with time remaining,
|
||||
then this routine returns the number of seconds until that outstanding
|
||||
alarm would have fired. If no previous ``alarm()`` request was
|
||||
outstanding, then zero is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``alarm()`` service causes the ``SIGALRM`` signal to
|
||||
be generated after the number of seconds specified by``seconds`` has elapsed.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Alarm requests do not queue. If ``alarm`` is called while
|
||||
a previous request is outstanding, the call will result in
|
||||
rescheduling the time at which the ``SIGALRM`` signal
|
||||
will be generated.
|
||||
|
||||
If the notification signal, ``SIGALRM``, is not caught or ignored, the
|
||||
calling process is terminated.
|
||||
|
||||
ualarm - Schedule Alarm in Microseconds
|
||||
---------------------------------------
|
||||
.. index:: alarm
|
||||
.. index:: microseonds alarm
|
||||
.. index:: usecs alarm
|
||||
.. index:: schedule alarm in microseonds
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <unistd.h>
|
||||
useconds_t ualarm(
|
||||
useconds_t useconds,
|
||||
useconds_t interval
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
This call always succeeds.
|
||||
|
||||
If there was a previous ``ualarm()`` request with time remaining,
|
||||
then this routine returns the number of seconds until that outstanding
|
||||
alarm would have fired. If no previous ``alarm()`` request was
|
||||
outstanding, then zero is returned.
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
The ``ualarm()`` service causes the ``SIGALRM`` signal to
|
||||
be generated after the number of microseconds specified by``useconds`` has elapsed.
|
||||
|
||||
When ``interval`` is non-zero, repeated timeout notification occurs
|
||||
with a period in microseconds specified by ``interval``.
|
||||
|
||||
**NOTES:**
|
||||
|
||||
Alarm requests do not queue. If ``alarm`` is called while
|
||||
a previous request is outstanding, the call will result in
|
||||
rescheduling the time at which the ``SIGALRM`` signal
|
||||
will be generated.
|
||||
|
||||
If the notification signal, ``SIGALRM``, is not caught or ignored, the
|
||||
calling process is terminated.
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
43
posix_users/status_of_implementation.rst
Normal file
43
posix_users/status_of_implementation.rst
Normal file
@ -0,0 +1,43 @@
|
||||
Status of Implementation
|
||||
########################
|
||||
|
||||
This chapter provides an overview of the status of the implementation
|
||||
of the POSIX API for RTEMS. The *POSIX 1003.1b Compliance Guide*
|
||||
provides more detailed information regarding the implementation of
|
||||
each of the numerous functions, constants, and macros specified by
|
||||
the POSIX 1003.1b standard.
|
||||
|
||||
RTEMS supports many of the process and user/group oriented services
|
||||
in a "single user/single process" manner. This means that although
|
||||
these services may be of limited usefulness or functionality, they
|
||||
are provided and do work in a coherent manner. This is significant
|
||||
when porting existing code from UNIX to RTEMS.
|
||||
|
||||
- Implementation
|
||||
- The current implementation of ``dup()`` is insufficient.
|
||||
- FIFOs ``mkfifo()`` are not currently implemented.
|
||||
- Asynchronous IO is not implemented.
|
||||
- The ``flockfile()`` family is not implemented
|
||||
- getc/putc unlocked family is not implemented
|
||||
- Shared Memory is not implemented
|
||||
- Mapped Memory is not implemented
|
||||
|
||||
- NOTES:
|
||||
|
||||
- For Shared Memory and Mapped Memory services, it is unclear what
|
||||
level of support is appropriate and possible for RTEMS.
|
||||
|
||||
- Functional Testing
|
||||
- Tests for unimplemented services
|
||||
|
||||
- Performance Testing
|
||||
- There are no POSIX Performance Tests.
|
||||
|
||||
- Documentation
|
||||
|
||||
- Many of the service description pages are not complete in this
|
||||
manual. These need to be completed and information added to the
|
||||
background and operations sections.
|
||||
|
||||
- Example programs (not just tests) would be very nice.
|
||||
|
219
posix_users/system_database.rst
Normal file
219
posix_users/system_database.rst
Normal file
@ -0,0 +1,219 @@
|
||||
System Databases Manager
|
||||
########################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The
|
||||
system databases manager is ...
|
||||
|
||||
The directives provided by the system databases manager are:
|
||||
|
||||
- ``getgrgid`` - Get Group File Entry for ID
|
||||
|
||||
- ``getgrgid_r`` - Reentrant Get Group File Entry
|
||||
|
||||
- ``getgrnam`` - Get Group File Entry for Name
|
||||
|
||||
- ``getgrnam_r`` - Reentrant Get Group File Entry for Name
|
||||
|
||||
- ``getpwuid`` - Get Password File Entry for UID
|
||||
|
||||
- ``getpwuid_r`` - Reentrant Get Password File Entry for UID
|
||||
|
||||
- ``getpwnam`` - Get Password File Entry for Name
|
||||
|
||||
- ``getpwnam_r`` - Reentrant Get Password File Entry for Name
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the system databases manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
getgrgid - Get Group File Entry for ID
|
||||
--------------------------------------
|
||||
.. index:: getgrgid
|
||||
.. index:: get group file entry for id
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgrgid(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getgrgid_r - Reentrant Get Group File Entry
|
||||
-------------------------------------------
|
||||
.. index:: getgrgid_r
|
||||
.. index:: reentrant get group file entry
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgrgid_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getgrnam - Get Group File Entry for Name
|
||||
----------------------------------------
|
||||
.. index:: getgrnam
|
||||
.. index:: get group file entry for name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgrnam(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getgrnam_r - Reentrant Get Group File Entry for Name
|
||||
----------------------------------------------------
|
||||
.. index:: getgrnam_r
|
||||
.. index:: reentrant get group file entry for name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getgrnam_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getpwuid - Get Password File Entry for UID
|
||||
------------------------------------------
|
||||
.. index:: getpwuid
|
||||
.. index:: get password file entry for uid
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getpwuid(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getpwuid_r - Reentrant Get Password File Entry for UID
|
||||
------------------------------------------------------
|
||||
.. index:: getpwuid_r
|
||||
.. index:: reentrant get password file entry for uid
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getpwuid_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getpwnam - Password File Entry for Name
|
||||
---------------------------------------
|
||||
.. index:: getpwnam
|
||||
.. index:: password file entry for name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getpwnam(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
getpwnam_r - Reentrant Get Password File Entry for Name
|
||||
-------------------------------------------------------
|
||||
.. index:: getpwnam_r
|
||||
.. index:: reentrant get password file entry for name
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int getpwnam_r(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT(c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation(OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
1333
posix_users/thread.rst
Normal file
1333
posix_users/thread.rst
Normal file
File diff suppressed because it is too large
Load Diff
173
posix_users/thread_cancellation.rst
Normal file
173
posix_users/thread_cancellation.rst
Normal file
@ -0,0 +1,173 @@
|
||||
Thread Cancellation Manager
|
||||
###########################
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The
|
||||
thread cancellation manager is ...
|
||||
|
||||
The directives provided by the thread cancellation manager are:
|
||||
|
||||
- ``pthread_cancel`` - Cancel Execution of a Thread
|
||||
|
||||
- ``pthread_setcancelstate`` - Set Cancelability State
|
||||
|
||||
- ``pthread_setcanceltype`` - Set Cancelability Type
|
||||
|
||||
- ``pthread_testcancel`` - Create Cancellation Point
|
||||
|
||||
- ``pthread_cleanup_push`` - Establish Cancellation Handler
|
||||
|
||||
- ``pthread_cleanup_pop`` - Remove Cancellation Handler
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
There is currently no text in this section.
|
||||
|
||||
Directives
|
||||
==========
|
||||
|
||||
This section details the thread cancellation manager’s directives.
|
||||
A subsection is dedicated to each of this manager’s directives
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
pthread_cancel - Cancel Execution of a Thread
|
||||
---------------------------------------------
|
||||
.. index:: pthread_cancel
|
||||
.. index:: cancel execution of a thread
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_cancel(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_setcancelstate - Set Cancelability State
|
||||
------------------------------------------------
|
||||
.. index:: pthread_setcancelstate
|
||||
.. index:: set cancelability state
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_setcancelstate(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_setcanceltype - Set Cancelability Type
|
||||
----------------------------------------------
|
||||
.. index:: pthread_setcanceltype
|
||||
.. index:: set cancelability type
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_setcanceltype(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_testcancel - Create Cancellation Point
|
||||
----------------------------------------------
|
||||
.. index:: pthread_testcancel
|
||||
.. index:: create cancellation point
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_testcancel(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cleanup_push - Establish Cancellation Handler
|
||||
-----------------------------------------------------
|
||||
.. index:: pthread_cleanup_push
|
||||
.. index:: establish cancellation handler
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_cleanup_push(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
pthread_cleanup_pop - Remove Cancellation Handler
|
||||
-------------------------------------------------
|
||||
.. index:: pthread_cleanup_pop
|
||||
.. index:: remove cancellation handler
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
int pthread_cleanup_push(
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
*E*
|
||||
The
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT (c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation (OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
157
posix_users/timer.rst
Normal file
157
posix_users/timer.rst
Normal file
@ -0,0 +1,157 @@
|
||||
Timer Manager
|
||||
#############
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
The timer manager is ...
|
||||
|
||||
The services provided by the timer manager are:
|
||||
|
||||
- ``timer_create`` - Create a Per-Process Timer
|
||||
|
||||
- ``timer_delete`` - Delete a Per-Process Timer
|
||||
|
||||
- ``timer_settime`` - Set Next Timer Expiration
|
||||
|
||||
- ``timer_gettime`` - Get Time Remaining on Timer
|
||||
|
||||
- ``timer_getoverrun`` - Get Timer Overrun Count
|
||||
|
||||
Background
|
||||
==========
|
||||
|
||||
Operations
|
||||
==========
|
||||
|
||||
System Calls
|
||||
============
|
||||
|
||||
This section details the timer manager’s services.
|
||||
A subsection is dedicated to each of this manager’s services
|
||||
and describes the calling sequence, related constants, usage,
|
||||
and status codes.
|
||||
|
||||
.. COMMENT: timer_create
|
||||
|
||||
timer_create - Create a Per-Process Timer
|
||||
-----------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
int timer_create(
|
||||
clockid_t clock_id,
|
||||
struct sigevent \*evp,
|
||||
timer_t \*timerid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EXXX`` -
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: timer_delete
|
||||
|
||||
timer_delete - Delete a Per-Process Timer
|
||||
-----------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int timer_delete(
|
||||
timer_t timerid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EXXX`` -
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: timer_settime
|
||||
|
||||
timer_settime - Set Next Timer Expiration
|
||||
-----------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int timer_settime(
|
||||
timer_t timerid,
|
||||
int flags,
|
||||
const struct itimerspec \*value,
|
||||
struct itimerspec \*ovalue
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EXXX`` -
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: timer_gettime
|
||||
|
||||
timer_gettime - Get Time Remaining on Timer
|
||||
-------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int timer_gettime(
|
||||
timer_t timerid,
|
||||
struct itimerspec \*value
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EXXX`` -
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: timer_getoverrun
|
||||
|
||||
timer_getoverrun - Get Timer Overrun Count
|
||||
------------------------------------------
|
||||
|
||||
**CALLING SEQUENCE:**
|
||||
|
||||
.. code:: c
|
||||
|
||||
#include <time.h>
|
||||
int timer_getoverrun(
|
||||
timer_t timerid
|
||||
);
|
||||
|
||||
**STATUS CODES:**
|
||||
|
||||
``EXXX`` -
|
||||
|
||||
**DESCRIPTION:**
|
||||
|
||||
**NOTES:**
|
||||
|
||||
.. COMMENT: COPYRIGHT(c) 1988-2002.
|
||||
|
||||
.. COMMENT: On-Line Applications Research Corporation(OAR).
|
||||
|
||||
.. COMMENT: All rights reserved.
|
||||
|
Loading…
x
Reference in New Issue
Block a user