mirror of
https://git.rtems.org/rtems-docs/
synced 2025-05-15 14:27:20 +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