23cd1e030e
Also add to the CI a problem matcher to better report issues Signed-off-by: Brennan Ashton <bashton@brennanashton.com>
876 lines
38 KiB
ReStructuredText
876 lines
38 KiB
ReStructuredText
=======================
|
|
Task Control Interfaces
|
|
=======================
|
|
|
|
**Tasks**. NuttX is a flat address OS. As such it does not support
|
|
*processes* in the way that, say, Linux does. NuttX only supports simple
|
|
threads running within the same address space. However, the programming
|
|
model makes a distinction between *tasks* and *pthreads*:
|
|
|
|
- *tasks* are threads which have a degree of independence
|
|
- `pthreads <#Pthread>`__ share some resources.
|
|
|
|
**File Descriptors and Streams**. This applies, in particular, in the
|
|
area of opened file descriptors and streams. When a task is started
|
|
using the interfaces in this section, it will be created with at most
|
|
three open files.
|
|
|
|
If ``CONFIG_DEV_CONSOLE`` is defined, the first three file descriptors
|
|
(corresponding to stdin, stdout, stderr) will be duplicated for the new
|
|
task. Since these file descriptors are duplicated, the child task can
|
|
free close them or manipulate them in any way without effecting the
|
|
parent task. File-related operations (open, close, etc.) within a task
|
|
will have no effect on other tasks. Since the three file descriptors are
|
|
duplicated, it is also possible to perform some level of redirection.
|
|
|
|
pthreads, on the other hand, will always share file descriptors with the
|
|
parent thread. In this case, file operations will have effect only all
|
|
pthreads the were started from the same parent thread.
|
|
|
|
**Executing Programs within a File System**. NuttX also provides
|
|
internal interfaces for the execution of separately built programs that
|
|
reside in a file system. These internal interfaces are, however,
|
|
non-standard and are documented with the NuttX binary
|
|
loader and NXFLAT documentation.
|
|
|
|
**Task Control Interfaces**. The following task control interfaces are
|
|
provided by NuttX:
|
|
|
|
.. note::
|
|
Maybe this can be converted into a table, or could otherwise
|
|
be replaced by the index if these are sectioned in this way.
|
|
|
|
Non-standard task control interfaces inspired by VxWorks interfaces:
|
|
|
|
- :c:func:`task_create`
|
|
- :c:func:`task_delete`
|
|
- :c:func:`task_restart`
|
|
|
|
Non-standard extensions to VxWorks-like interfaces to support POSIX
|
|
`Cancellation
|
|
Points <https://cwiki.apache.org/confluence/display/NUTTX/Cancellation+Points>`__.
|
|
|
|
- :c:func:`task_setcancelstate`
|
|
- :c:func:`task_setcanceltype`
|
|
- :c:func:`task_testcancel`
|
|
|
|
Standard interfaces
|
|
|
|
- :c:func:`exit`
|
|
- :c:func:`getpid`
|
|
|
|
Standard ``vfork`` and ``exec[v|l]`` interfaces:
|
|
|
|
- :c:func:`vfork`
|
|
- :c:func:`exec`
|
|
- :c:func:`execv`
|
|
- :c:func:`execl`
|
|
|
|
Standard ``posix_spawn`` interfaces:
|
|
|
|
- :c:func:`posix_spawn` and :c:func:`posix_spawnp`
|
|
- :c:func:`posix_spawn_file_actions_init`
|
|
- :c:func:`posix_spawn_file_actions_destroy`
|
|
- :c:func:`posix_spawn_file_actions_addclose`
|
|
- :c:func:`posix_spawn_file_actions_adddup2`
|
|
- :c:func:`posix_spawn_file_actions_addopen`
|
|
- :c:func:`posix_spawnattr_init`
|
|
- :c:func:`posix_spawnattr_getflags`
|
|
- :c:func:`posix_spawnattr_getschedparam`
|
|
- :c:func:`posix_spawnattr_getschedpolicy`
|
|
- :c:func:`posix_spawnattr_getsigmask`
|
|
- :c:func:`posix_spawnattr_setflags`
|
|
- :c:func:`posix_spawnattr_setschedparam`
|
|
- :c:func:`posix_spawnattr_setschedpolicy`
|
|
- :c:func:`posix_spawnattr_setsigmask`
|
|
|
|
Non-standard task control interfaces inspired by ``posix_spawn``:
|
|
|
|
- :c:func:`task_spawn`
|
|
- :c:func:`task_spawnattr_getstacksize`
|
|
- :c:func:`task_spawnattr_setstacksize`
|
|
- :c:func:`posix_spawn_file_actions_init`
|
|
|
|
Functions
|
|
---------
|
|
|
|
.. c:function:: int task_create(char *name, int priority, int stack_size, main_t entry, char * const argv[])
|
|
|
|
This function creates and activates a new task with a
|
|
specified priority and returns its system-assigned ID.
|
|
|
|
The entry address entry is the address of the "main" function of the
|
|
task. This function will be called once the C environment has been set
|
|
up. The specified function will be called with four arguments. Should
|
|
the specified routine return, a call to :c:func:`exit` will automatically be
|
|
made.
|
|
|
|
Note that an arbitrary number of arguments may be passed to the spawned
|
|
functions.
|
|
|
|
The arguments are copied (via ``strdup``) so that the life of the passed
|
|
strings is not dependent on the life of the caller to :c:func:`task_create`.
|
|
|
|
The newly created task does not inherit scheduler characteristics from
|
|
the parent task: The new task is started at the default system priority
|
|
and with the ``SCHED_FIFO`` scheduling policy. These characteristics may be
|
|
modified after the new task has been started.
|
|
|
|
The newly created task does inherit the first three file descriptors
|
|
(corresponding to stdin, stdout, and stderr) and redirection of standard
|
|
I/O is supported.
|
|
|
|
:param name: Name of the new task
|
|
:param priority: Priority of the new task
|
|
:param stack_size: size (in bytes) of the stack needed
|
|
:param entry: Entry point of a new task
|
|
:param argv: A pointer to an array of input parameters. The array should
|
|
be terminated with a NULL argv[] value. If no parameters are
|
|
required, argv may be NULL.
|
|
|
|
:return: the non-zero task ID of the new task or ERROR if memory is
|
|
insufficient or the task cannot be created
|
|
(```errno`` <#ErrnoAccess>`__ is not set).
|
|
|
|
**Defined in:** ``sched.h``
|
|
|
|
**POSIX Compatibility:** This is a NON-POSIX interface. VxWorks provides
|
|
the following similar interface:
|
|
|
|
.. code-block:: c
|
|
|
|
int taskSpawn(char *name, int priority, int options, int stackSize, FUNCPTR entryPt,
|
|
int arg1, int arg2, int arg3, int arg4, int arg5,
|
|
int arg6, int arg7, int arg8, int arg9, int arg10);
|
|
|
|
The NuttX :c:func:`task_create` differs from VxWorks' :c:func:`taskSpawn` in the
|
|
following ways:
|
|
|
|
- Interface name
|
|
- Various differences in types of arguments
|
|
- There is no options argument.
|
|
- A variable number of parameters can be passed to a task (VxWorks
|
|
supports ten).
|
|
|
|
.. c:function:: int task_delete(pid_t pid)
|
|
|
|
This function causes a specified task to cease to
|
|
exist. Its stack and TCB will be deallocated. This function is the
|
|
companion to ``task_create()``. This is the version of the function
|
|
exposed to the user; it is simply a wrapper around the internal,
|
|
``nxtask_terminate()`` function.
|
|
|
|
The logic in this function only deletes non-running tasks. If the
|
|
``pid`` parameter refers to the currently running task, then processing
|
|
is redirected to ``exit()``. This can only happen if a task calls
|
|
``task_delete()`` in order to delete itself.
|
|
|
|
This function obeys the semantics of pthread cancellation: task deletion
|
|
is deferred if cancellation is disabled or if deferred cancellation is
|
|
supported (with `Cancellation
|
|
Points <https://cwiki.apache.org/confluence/display/NUTTX/Cancellation+Points>`__
|
|
enabled).
|
|
|
|
:param pid: The task ID of the task to delete. An ID of zero signifies
|
|
the calling task. Any attempt by the calling task will be
|
|
automatically re-directed to ``exit()``.
|
|
|
|
:return: ``OK``, or ``ERROR`` if the task cannot be deleted. The
|
|
```errno`` <#ErrnoAccess>`__ is set to indicate the nature of the
|
|
failure. This function can fail, for example, if the provided pid
|
|
does not correspond to a currently executing task.
|
|
|
|
**Assumptions/Limitations:**
|
|
|
|
``task_delete()`` must be used with caution: If the task holds resources
|
|
(for example, allocated memory or semaphores needed by other tasks),
|
|
then ``task_delete()`` can strand those resources.
|
|
|
|
**POSIX Compatibility:** This is a NON-POSIX interface. VxWorks provides
|
|
the following similar interface:
|
|
|
|
The NuttX task_delete() differs from VxWorks' taskDelete() in the
|
|
following ways:
|
|
|
|
- No support is provided for calling the tasks deletion routines
|
|
(because the VxWorks ``taskDeleteHookAdd()`` is not supported).
|
|
However, if ``atexit()`` or ``on_exit`` support is enabled, those
|
|
will be called when the task deleted.
|
|
- Deletion of self is supported, but only because ``task_delete()``
|
|
will re-direct processing to ``exit()``.
|
|
|
|
.. :c:funcion:: int task_restart(pid_t pid)
|
|
|
|
This function *restarts* a task. The task is first
|
|
terminated and then reinitialized with same ID, priority, original entry
|
|
point, stack size, and parameters it had when it was first started.
|
|
|
|
**NOTES:**
|
|
|
|
#. The normal task exit clean up is not performed. For example, file
|
|
descriptors are not closed; any files opened prior to the restart
|
|
will remain opened after the task is restarted.
|
|
#. Memory allocated by the task before it was restart is not freed. A
|
|
task that is subject to being restart must be designed in such a way
|
|
as to avoid memory leaks.
|
|
#. Initialized data is not reset. All global or static data is left in
|
|
the same state as when the task was terminated. This *feature* may be
|
|
used by restart task to detect that it has been restarted, for
|
|
example.
|
|
|
|
:param pid: The task ID of the task to delete. An ID of zero would
|
|
signify the calling task (However, support for a task to restart
|
|
itself has not been implemented).
|
|
|
|
:return: ``OK``, or ``ERROR`` if the task ID is invalid or the task could not be
|
|
restarted. This function can fail if: (1) A pid of zero or the pid of
|
|
the calling task is provided (functionality not implemented) (2) The
|
|
pid is not associated with any task known to the system.
|
|
|
|
**POSIX Compatibility:** This is a NON-POSIX interface. VxWorks provides
|
|
the following similar interface:
|
|
|
|
.. code-block:: c
|
|
|
|
STATUS taskRestart (int tid);
|
|
|
|
The NuttX :c:func:`task_restart` differs from VxWorks' :c:func:`taskRestart` in the
|
|
following ways:
|
|
|
|
- Restart of the currently running task is not supported by NuttX.
|
|
- The VxWorks description says that the ID, priority, etc. take the
|
|
value that they had when the task was *terminated*.
|
|
|
|
.. c:function:: int task_setcancelstate(int state, int *oldstate)
|
|
|
|
This function atomically sets
|
|
both the calling task's cancellability state to the indicated state and
|
|
returns the previous cancellability state at the location referenced by
|
|
oldstate. Legal values for state are TASK_CANCEL_ENABLE and
|
|
TASK_CANCEL_DISABLE.
|
|
|
|
Any pending thread cancellation may occur at the time that the
|
|
cancellation state is set to TASK_CANCEL_ENABLE.
|
|
|
|
The cancellability state and type of any newly created tasks are
|
|
TASK_CANCEL_ENABLE and TASK_CANCEL_DEFERRED respectively.
|
|
|
|
:param state: New cancellation state. One of PTHREAD_CANCEL_ENABLE or
|
|
PTHREAD_CANCEL_DISABLE.
|
|
:param oldstate: Location to return the previous cancellation state.
|
|
|
|
:return: Zero (``OK``) on success; ``ERROR`` is returned on any failure
|
|
with the ``errno`` value set appropriately:
|
|
|
|
- ``ESRCH``. No thread could be found corresponding to that specified
|
|
by the given thread ID.
|
|
|
|
**POSIX Compatibility:** This is a non-standard interface. It extends
|
|
the functionality of ``pthread_setcancelstate()`` to tasks and supports
|
|
use of ``task_delete()``.
|
|
|
|
.. c:function:: int task_setcanceltype(int type, FAR int *oldtype);
|
|
|
|
This function atomically both
|
|
sets the calling task's cancellability type to the indicated type and
|
|
returns the previous cancellability type at the location referenced by
|
|
``oldtype``. Legal values for type are ``TASK_CANCEL_DEFERRED`` and
|
|
``TASK_CANCEL_ASYNCHRONOUS``.
|
|
|
|
The cancellability state and type of any newly created tasks are
|
|
``TASK_CANCEL_ENABLE`` and ``TASK_CANCEL_DEFERRED`` respectively.
|
|
|
|
:param type: New cancellation state. One of ``PTHREAD_CANCEL_DEFERRED``
|
|
or ``PTHREAD_CANCEL_ASYNCHRONOUS``.
|
|
:param oldtype: Location to return the previous cancellation type.
|
|
|
|
:return: Zero (``OK``) on success; ``ERROR`` is returned on any failure with the
|
|
``errno`` value set appropriately:
|
|
|
|
- ``ESRCH``. No thread could be found corresponding to that specified
|
|
by the given thread ID.
|
|
|
|
**POSIX Compatibility:** This is a non-standard interface. It extends
|
|
the functionality of ``pthread_setcanceltype()`` to tasks and supports
|
|
use of ``task_delete()``.
|
|
|
|
.. c:function:: void task_testcancel(void)
|
|
|
|
Creates a `Cancellation
|
|
Point <https://cwiki.apache.org/confluence/display/NUTTX/Cancellation+Points>`__
|
|
in the calling task. The ``task_testcancel()`` function has no effect if
|
|
cancellability is disabled.
|
|
|
|
**POSIX Compatibility:** This is a non-standard interface. It extends
|
|
the functionality of ``pthread_testcancel()`` to tasks and supports use
|
|
of ``task_delete()``.
|
|
|
|
.. c:function:: void exit(int code)
|
|
.. c:function:: void _exit(int code)
|
|
|
|
.. #include <sched.h>
|
|
.. #include <nuttx/unistd.h>
|
|
|
|
Causes the calling task to cease to exist
|
|
-- its stack and TCB will be deallocated. exit differs from \_exit in
|
|
that it flushes streams, closes file descriptors and will execute any
|
|
function registered with ``atexit()`` or ``on_exit()``.
|
|
|
|
:param code: (ignored)
|
|
|
|
**POSIX Compatibility:** This is equivalent to the ANSI interface:
|
|
|
|
::
|
|
|
|
void exit(int code);
|
|
|
|
And the UNIX interface:
|
|
|
|
::
|
|
|
|
void _exit(int code);
|
|
|
|
The NuttX exit() differs from ANSI exit() in the following ways:
|
|
|
|
- The ``code`` parameter is ignored.
|
|
|
|
.. c:function:: pid_t getpid(void)
|
|
|
|
.. #include <unistd.h>
|
|
|
|
Returns the task ID of the calling task.
|
|
The task ID will be invalid if called at the interrupt level.
|
|
|
|
:return: The task ID of the calling task.
|
|
|
|
**POSIX Compatibility:** Compatible with the POSIX interface of the same
|
|
name.
|
|
|
|
.. c:function:: pid_t vfork(void)
|
|
|
|
The ``vfork()`` function has the same effect as
|
|
``fork()``, except that the behavior is undefined if the process created
|
|
by ``vfork()`` either modifies any data other than a variable of type
|
|
``pid_t`` used to store the return value from ``vfork()``, or returns
|
|
from the function in which ``vfork()`` was called, or calls any other
|
|
function before successfully calling ``_exit()`` or one of the ``exec``
|
|
family of functions.
|
|
|
|
NOTE: ``vfork()`` is not an independent NuttX feature, but is
|
|
implemented in architecture-specific logic (using only helper
|
|
functions from the NuttX core logic). As a result, ``vfork()`` may
|
|
not be available on all architectures.
|
|
|
|
:return: Upon successful completion, ``vfork()`` returns 0 to
|
|
the child process and returns the process ID of the child process to the
|
|
parent process. Otherwise, -1 is returned to the parent, no child
|
|
process is created, and ``errno`` is set to indicate the error.
|
|
|
|
**POSIX Compatibility:** Compatible with the BSD/Linux interface of the
|
|
same name. POSIX marks this interface as Obsolete.
|
|
|
|
.. c:function:: int exec(FAR const char *filename, FAR char * const *argv, FAR const struct symtab_s *exports, int nexports)
|
|
|
|
This non-standard, NuttX function is similar to
|
|
``execv()`` and ``posix_spawn()`` but differs in the following ways;
|
|
|
|
- Unlike ``execv()`` and ``posix_spawn()`` this function accepts symbol
|
|
table information as input parameters. This means that the symbol
|
|
table used to link the application prior to execution is provided by
|
|
the caller, not by the system.
|
|
- Unlike ``execv()``, this function always returns.
|
|
|
|
This non-standard interface is included as a official NuttX API only
|
|
because it is needed in certain build modes: ``exec()`` is probably the
|
|
only want to load programs in the PROTECTED mode. Other file execution
|
|
APIs rely on a symbol table provided by the OS. In the PROTECTED build
|
|
mode, the OS cannot provide any meaningful symbolic information for
|
|
execution of code in the user-space blob so that is the ``exec()``
|
|
function is really needed in that build case
|
|
|
|
The interface is available in the FLAT build mode although it is not
|
|
really necessary in that case. It is currently used by some example code
|
|
under the ``apps/`` that that generate their own symbol tables for
|
|
linking test programs. So although it is not necessary, it can still be
|
|
useful.
|
|
|
|
The interface would be completely useless and will not be supported in
|
|
the KERNEL build mode where the contrary is true: An application process
|
|
cannot provide any meaning symbolic information for use in linking a
|
|
different process.
|
|
|
|
**NOTE**: This function is flawed and useless without
|
|
``CONFIG_SCHED_ONEXIT`` and ``CONFIG_SCHED_HAVE_PARENT`` because without
|
|
those features there is then no mechanism to unload the module once it
|
|
exits.
|
|
|
|
:param filename: The path to the program to be executed. If
|
|
``CONFIG_LIB_ENVPATH`` is defined in the configuration, then this may
|
|
be a relative path from the current working directory. Otherwise,
|
|
``path`` must be the absolute path to the program.
|
|
:param argv: A pointer to an array of string arguments. The end of the
|
|
array is indicated with a NULL entry.
|
|
:param exports: The address of the start of the caller-provided symbol
|
|
table. This symbol table contains the addresses of symbols exported
|
|
by the caller and made available for linking the module into the
|
|
system.
|
|
:param nexports: The number of symbols in the ``exports`` table.
|
|
|
|
:return: Zero (OK) is returned on success; On any failure, ``exec()``
|
|
will return -1 (``ERROR``) and will set the ``errno`` value
|
|
appropriately.
|
|
|
|
**POSIX Compatibility:** This is a non-standard interface unique to
|
|
NuttX. Motivation for inclusion of this non-standard interface in
|
|
certain build modes is discussed above.
|
|
|
|
.. c:function:: int execv(FAR const char *path, FAR char * const argv[])
|
|
|
|
The standard ``exec`` family of functions will replace
|
|
the current process image with a new process image. The new image will
|
|
be constructed from a regular, executable file called the new process
|
|
image file. There will be no return from a successful ``exec``, because
|
|
the calling process image is overlaid by the new process image.
|
|
|
|
Simplified ``execl()`` and ``execv()`` functions are provided by NuttX
|
|
for compatibility. NuttX is a tiny embedded RTOS that does not support
|
|
processes and hence the concept of overlaying a tasks process image with
|
|
a new process image does not make any sense. In NuttX, these functions
|
|
are wrapper functions that:
|
|
|
|
#. Call the non-standard ``binfmt`` function ``exec()``, and then
|
|
#. ``exit(0)``.
|
|
|
|
Note the inefficiency when ``execv()`` or ``execl()`` is called in the
|
|
normal, two-step process: (1) first call ``vfork()`` to create a new
|
|
thread, then (2) call ``execv()`` or ``execl()`` to replace the new
|
|
thread with a program from the file system. Since the new thread will be
|
|
terminated by the ``execv()`` or ``execl()`` call, it really served no
|
|
purpose other than to support POSIX compatibility.
|
|
|
|
The non-standard binfmt function ``exec()`` needs to have (1) a symbol
|
|
table that provides the list of symbols exported by the base code, and
|
|
(2) the number of symbols in that table. This information is currently
|
|
provided to ``exec()`` from ``execv()`` or ``execl()`` via NuttX
|
|
configuration settings:
|
|
|
|
- ``CONFIG_LIBC_EXECFUNCS``: Enable ``execv()`` and ``execl()`` support
|
|
- ``CONFIG_EXECFUNCS_SYMTAB_ARRAY``: Name of the symbol table used by
|
|
``execv()`` or ``execl()``.
|
|
- ``CONFIG_EXECFUNCS_NSYMBOLS_VAR``: Name of the ``int`` variable
|
|
holding the number of symbols in the symbol table
|
|
|
|
As a result of the above, the current implementations of ``execl()`` and
|
|
``execv()`` suffer from some incompatibilities that may or may not be
|
|
addressed in a future version of NuttX. Other than just being an
|
|
inefficient use of MCU resource, the most serious of these is that the
|
|
``exec``'ed task will not have the same task ID as the ``vfork``'ed
|
|
function. So the parent function cannot know the ID of the ``exec``'ed
|
|
task.
|
|
|
|
:param path: The path to the program to be executed. If
|
|
``CONFIG_LIB_ENVPATH`` is defined in the configuration, then this may
|
|
be a relative path from the current working directory. Otherwise,
|
|
:param path: must be the absolute path to the program.
|
|
|
|
:return: This function does not return on success. On
|
|
failure, it will return -1 (``ERROR``) and will set the ``errno`` value
|
|
appropriately.
|
|
|
|
**POSIX Compatibility:** Similar with the POSIX interface of the same
|
|
name. There are, however, several compatibility issues as detailed in
|
|
the description above.
|
|
|
|
.. c:function:: int execl(FAR const char *path, ...)
|
|
|
|
``execl()`` is functionally equivalent to
|
|
`execv() <#execv>`__, differing only in the form of its input
|
|
parameters. See the description of `execv() <#execv>`__ for additional
|
|
information.
|
|
|
|
:param path: The path to the program to be executed. If
|
|
``CONFIG_LIB_ENVPATH`` is defined in the configuration, then this may
|
|
be a relative path from the current working directory. Otherwise,
|
|
:param path: must be the absolute path to the program.
|
|
|
|
:return: This function does not return on success. On
|
|
failure, it will return -1 (``ERROR``) and will set the ``errno`` value
|
|
appropriately.
|
|
|
|
**POSIX Compatibility:** Similar with the POSIX interface of the same
|
|
name. There are, however, several compatibility issues as detailed in
|
|
the description of `execv() <#execv>`__.
|
|
|
|
.. c:function:: int posix_spawn(FAR pid_t *pid, FAR const char *path, \
|
|
FAR const posix_spawn_file_actions_t *file_actions, \
|
|
FAR const posix_spawnattr_t *attr, \
|
|
FAR char * const argv[], FAR char * const envp[])
|
|
|
|
.. c:function:: int posix_spawnp(FAR pid_t *pid, FAR const char *file, \
|
|
FAR const posix_spawn_file_actions_t *file_actions, \
|
|
FAR const posix_spawnattr_t *attr, \
|
|
FAR char * const argv[], FAR char * const envp[]);
|
|
|
|
The ``posix_spawn()`` and ``posix_spawnp()`` functions
|
|
will create a new, child task, constructed from a regular executable
|
|
file.
|
|
|
|
:param pid: Upon successful completion, ``posix_spawn()`` and
|
|
``posix_spawnp()`` will return the task ID of the child task to the
|
|
parent task, in the variable pointed to by a non-NULL ``pid``
|
|
argument. If the ``pid`` argument is a null pointer, the process ID
|
|
of the child is not returned to the caller.
|
|
|
|
:param path: The ``path`` argument to ``posix_spawn()`` is
|
|
the absolute path that identifies the file to execute. The ``file``
|
|
argument to ``posix_spawnp()`` may also be a relative path and will
|
|
be used to construct a pathname that identifies the file to execute.
|
|
In the case of a relative path, the path prefix for the file will be
|
|
obtained by a search of the directories passed as the environment
|
|
variable PATH.
|
|
|
|
NOTE: NuttX provides only one implementation: If
|
|
``CONFIG_LIB_ENVPATH`` is defined, then only ``posix_spawnp()``
|
|
behavior is supported; otherwise, only ``posix_spawn`` behavior is
|
|
supported.
|
|
|
|
:param file_actions: If ``file_actions`` is a null pointer, then file
|
|
descriptors open in the calling process will remain open in the child
|
|
process (unless ``CONFIG_FDCLONE_STDIO`` is defined). If
|
|
``file_actions`` is not NULL, then the file descriptors open in the
|
|
child process will be those open in the calling process as modified
|
|
by the spawn file actions object pointed to by ``file_actions``.
|
|
|
|
:param attr: If the value of the ``attr`` parameter is ``NULL``, the all
|
|
default values for the POSIX spawn attributes will be used.
|
|
Otherwise, the attributes will be set according to the spawn flags.
|
|
The ``posix_spawnattr_t`` spawn attributes object type is defined in
|
|
``spawn.h``. It will contains these attributes, not all of which are
|
|
supported by NuttX:
|
|
|
|
- ``POSIX_SPAWN_SETPGROUP``: Setting of the new task's process group
|
|
is not supported. NuttX does not support process groups.
|
|
- ``POSIX_SPAWN_SETSCHEDPARAM``: Set new tasks priority to the
|
|
``sched_param`` value.
|
|
- ``POSIX_SPAWN_SETSCHEDULER``: Set the new task's scheduler policy
|
|
to the ``sched_policy`` value.
|
|
- ``POSIX_SPAWN_RESETIDS`` Resetting of the effective user ID of the
|
|
child process is not supported. NuttX does not support effective
|
|
user IDs.
|
|
- ``POSIX_SPAWN_SETSIGMASK``: Set the new task's signal mask.
|
|
- ``POSIX_SPAWN_SETSIGDEF``: Resetting signal default actions is not
|
|
supported. NuttX does not support default signal actions.
|
|
|
|
:param argv: ``argv[]`` is the argument list for the new task.
|
|
``argv[]`` is an array of pointers to null-terminated strings. The
|
|
list is terminated with a null pointer.
|
|
|
|
:param envp: The ``envp[]`` argument is not used by NuttX and may be
|
|
``NULL``. In standard implementations, ``envp[]`` is an array of
|
|
character pointers to null-terminated strings that provide the
|
|
environment for the new process image. The environment array is
|
|
terminated by a null pointer. In NuttX, the ``envp[]`` argument is
|
|
ignored and the new task will inherit the environment of the parent
|
|
task unconditionally.
|
|
|
|
:return: Zero on success. Otherwise, an error number will be returned as the
|
|
function return value to indicate the error:
|
|
|
|
- ``EINVAL``: The value specified by ``file_actions`` or ``attr`` is
|
|
invalid.
|
|
- Any errors that might have been return if ``vfork()`` and
|
|
``exec[l|v]()`` had been called.
|
|
|
|
**Assumptions/Limitations:**
|
|
|
|
- NuttX provides only ``posix_spawn()`` or ``posix_spawnp()`` behavior
|
|
depending upon the setting of ``CONFIG_LIB_ENVPATH``: If
|
|
``CONFIG_LIB_ENVPATH`` is defined, then only ``posix_spawnp()``
|
|
behavior is supported; otherwise, only ``posix_spawn()`` behavior is
|
|
supported.
|
|
- The ``envp`` argument is not used and the ``environ`` variable is not
|
|
altered (NuttX does not support the ``environ`` variable).
|
|
- Process groups are not supported (See ``POSIX_SPAWN_SETPGROUP``
|
|
above).
|
|
- Effective user IDs are not supported (See ``POSIX_SPAWN_RESETIDS``
|
|
above).
|
|
- Signal default actions cannot be modified in the newly task executed
|
|
because NuttX does not support default signal actions (See
|
|
``POSIX_SPAWN_SETSIGDEF``).
|
|
|
|
**POSIX Compatibility:** The value of the ``argv[0]`` received by the
|
|
child task is assigned by NuttX. For the caller of ``posix_spawn()``,
|
|
the provided argv[0] will correspond to ``argv[1]`` received by the new
|
|
task.
|
|
|
|
.. c:function:: int posix_spawn_file_actions_init(FAR posix_spawn_file_actions_t *file_actions)
|
|
|
|
Initializes the object referenced by ``file_actions`` to an empty set of
|
|
file actions for subsequent use in a call to ``posix_spawn()`` or
|
|
``posix_spawnp()``.
|
|
|
|
**Input Parameters:**
|
|
|
|
- ``file_actions``: The address of the ``posix_spawn_file_actions_t``
|
|
to be initialized.
|
|
|
|
**Returned Value:** On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``.
|
|
|
|
.. c:function:: int posix_spawn_file_actions_destroy(FAR posix_spawn_file_actions_t *file_actions)
|
|
|
|
Destroys the object referenced by ``file_actions`` which was previously
|
|
initialized by ``posix_spawn_file_actions_init()``, returning any
|
|
resources obtained at the time of initialization to the system for
|
|
subsequent reuse. A ``posix_spawn_file_actions_t`` may be reinitialized
|
|
after having been destroyed, but must not be reused after destruction,
|
|
unless it has been reinitialized.
|
|
|
|
:param file_actions: The address of the ``posix_spawn_file_actions_t``
|
|
to be destroyed.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawn_file_actions_addclose(FAR posix_spawn_file_actions_t *file_actions, int fd)
|
|
|
|
Adds a *close* operation to the list of operations associated with the
|
|
object referenced by ``file_actions``, for subsequent use in a call to
|
|
``posix_spawn()`` or ``posix_spawnp()``. The descriptor referred to by
|
|
``fd`` is closed as if ``close()`` had been called on it prior to the
|
|
new child process starting execution.
|
|
|
|
:param file_actions: The address of the ``posix_spawn_file_actions_t``
|
|
object to which the *close* operation will be appended.
|
|
:param fd: The file descriptor to be closed.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawn_file_actions_adddup2(FAR posix_spawn_file_actions_t *file_actions, int fd1, int fd2)
|
|
|
|
Adds a *dup2* operation to the list of operations associated with the
|
|
object referenced by ``file_actions``, for subsequent use in a call to
|
|
``posix_spawn()`` or ``posix_spawnp()``. The descriptor referred to by
|
|
``fd2`` is created as if ``dup2()`` had been called on ``fd1`` prior to
|
|
the new child process starting execution.
|
|
|
|
:param file_actions: The address of the ``posix_spawn_file_actions_t``
|
|
object to which the *dup2* operation will be appended.
|
|
:param fd1: The file descriptor to be be duplicated. The first file
|
|
descriptor to be argument to ``dup2()``.
|
|
:param fd2: The file descriptor to be be created. The second file
|
|
descriptor to be argument to ``dup2()``.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawn_file_actions_addopen(FAR posix_spawn_file_actions_t *file_actions, \
|
|
int fd, FAR const char *path, int oflags, mode_t mode);
|
|
|
|
Adds an *open* operation to the list of operations associated with the
|
|
object referenced by ``file_actions``, for subsequent use in a call to
|
|
``posix_spawn()`` or ``posix_spawnp()``. The descriptor referred to by
|
|
``fd`` is opened using the ``path``, ``oflag``, and ``mode`` arguments
|
|
as if ``open()`` had been called on it prior to the new child process
|
|
starting execution. The string path is copied by the
|
|
``posix_spawn_file_actions_addopen()`` function during this process, so
|
|
storage need not be persistent in the caller.
|
|
|
|
:param file_actions: The address of the ``posix_spawn_file_actions_t``
|
|
object to which the *open* operation will be appended.
|
|
:param fd: The file descriptor to be opened.
|
|
:param path: The path to be opened.
|
|
:param oflags: Open flags.
|
|
:param mode: File creation mode/
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_init(FAR posix_spawnattr_t *attr)
|
|
|
|
The ``posix_spawnattr_init()`` function initializes the
|
|
object referenced by ``attr``, to an empty set of spawn attributes for
|
|
subsequent use in a call to ``posix_spawn()`` or ``posix_spawnp()``.
|
|
|
|
Then the spawn attributes are no longer needed, they should be destroyed
|
|
by calling ``posix_spawnattr_destroyed()``. In NuttX, however,
|
|
``posix_spawnattr_destroyed()`` is just stub:
|
|
|
|
For portability, the convention of calling
|
|
``posix_spawnattr_destroyed()`` when the attributes are not longer
|
|
needed should still be followed.
|
|
|
|
:param attr: The address of the spawn attributes to be initialized.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_getflags(FAR const posix_spawnattr_t *attr, FAR short *flags)
|
|
|
|
The ``posix_spawnattr_getflags()`` function will obtain
|
|
the value of the *spawn-flags* attribute from the attributes object
|
|
referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be queried.
|
|
:param flags: The location to return the spawn flags
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_getschedparam(FAR const posix_spawnattr_t *attr, FAR struct sched_param *param)
|
|
|
|
The ``posix_spawnattr_getschedparam()`` function will
|
|
obtain the value of the *spawn-schedparam* attribute from the attributes
|
|
object referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be queried.
|
|
:param param: The location to return the *spawn-schedparam* value.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_getschedpolicy(FAR const posix_spawnattr_t *attr, FAR int *policy)
|
|
|
|
The ``posix_spawnattr_getschedpolicy()`` function will
|
|
obtain the value of the *spawn-schedpolicy* attribute from the
|
|
attributes object referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be queried.
|
|
:param policy: The location to return the *spawn-schedpolicy* value.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_getsigmask(FAR const posix_spawnattr_t *attr, FAR sigset_t *sigmask)
|
|
|
|
``posix_spawnattr_getsigdefault()`` function will
|
|
obtain the value of the *spawn-sigmask* attribute from the attributes
|
|
object referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be queried.
|
|
:param sigmask: The location to return the *spawn-sigmask* value.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_setflags(FAR posix_spawnattr_t *attr, short flags)
|
|
|
|
The ``posix_spawnattr_setflags()`` function will set
|
|
the *spawn-flags* attribute in an initialized attributes object
|
|
referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be used.
|
|
:param flags: The new value of the *spawn-flags* attribute.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_setschedparam(FAR posix_spawnattr_t *attr, FAR const struct sched_param *param)
|
|
|
|
The ``posix_spawnattr_setschedparam()`` function will
|
|
set the *spawn-schedparam* attribute in an initialized attributes object
|
|
referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be used.
|
|
:param param: The new value of the *spawn-schedparam* attribute.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_setschedpolicy(FAR posix_spawnattr_t *attr, int policy)
|
|
|
|
The ``posix_spawnattr_setschedpolicy()`` function will
|
|
set the *spawn-schedpolicy* attribute in an initialized attributes
|
|
object referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be used.
|
|
:param policy: The new value of the *spawn-schedpolicy* attribute.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int posix_spawnattr_setsigmask(FAR posix_spawnattr_t *attr, FAR const sigset_t *sigmask)
|
|
|
|
The ``posix_spawnattr_setsigmask()`` function will set
|
|
the *spawn-sigmask* attribute in an initialized attributes object
|
|
referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be used.
|
|
:param sigmask: The new value of the *spawn-sigmask* attribute.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int task_spawn(FAR pid_t *pid, FAR const char *name, main_t entry, \
|
|
FAR const posix_spawn_file_actions_t *file_actions, \
|
|
FAR const posix_spawnattr_t *attr, \
|
|
FAR char * const argv[], FAR char * const envp[])
|
|
|
|
The ``task_spawn()`` function will create a new, child
|
|
task, where the entry point to the task is an address in memory.
|
|
|
|
:param pid: Upon successful completion, ``task_spawn()`` will return the
|
|
task ID of the child task to the parent task, in the variable pointed
|
|
to by a non-NULL ``pid`` argument. If the ``pid`` argument is a null
|
|
pointer, the process ID of the child is not returned to the caller.
|
|
|
|
:param name: The name to assign to the child task.
|
|
|
|
:param entry: The child task's entry point (an address in memory).
|
|
|
|
:param file_actions: If ``file_actions`` is a null pointer, then file
|
|
descriptors open in the calling process will remain open in the child
|
|
process (unless ``CONFIG_FDCLONE_STDIO`` is defined). If
|
|
``file_actions`` is not NULL, then the file descriptors open in the
|
|
child process will be those open in the calling process as modified
|
|
by the spawn file actions object pointed to by ``file_actions``.
|
|
|
|
:param attr: If the value of the ``attr`` parameter is ``NULL``, the all
|
|
default values for the POSIX spawn attributes will be used.
|
|
Otherwise, the attributes will be set according to the spawn flags.
|
|
The ``posix_spawnattr_t`` spawn attributes object type is defined in
|
|
``spawn.h``. It will contains these attributes, not all of which are
|
|
supported by NuttX:
|
|
|
|
- ``POSIX_SPAWN_SETPGROUP``: Setting of the new task's process group
|
|
is not supported. NuttX does not support process groups.
|
|
- ``POSIX_SPAWN_SETSCHEDPARAM``: Set new tasks priority to the
|
|
``sched_param`` value.
|
|
- ``POSIX_SPAWN_SETSCHEDULER``: Set the new task's scheduler policy
|
|
to the ``sched_policy`` value.
|
|
- ``POSIX_SPAWN_RESETIDS`` Resetting of the effective user ID of the
|
|
child process is not supported. NuttX does not support effective
|
|
user IDs.
|
|
- ``POSIX_SPAWN_SETSIGMASK``: Set the new task's signal mask.
|
|
- ``POSIX_SPAWN_SETSIGDEF``: Resetting signal default actions is not
|
|
supported. NuttX does not support default signal actions.
|
|
|
|
And the non-standard:
|
|
|
|
- ``TASK_SPAWN_SETSTACKSIZE``: Set the stack size for the new task.
|
|
|
|
:param argv: ``argv[]`` is the argument list for the new task.
|
|
``argv[]`` is an array of pointers to null-terminated strings. The
|
|
list is terminated with a null pointer.
|
|
|
|
:param envp: The ``envp[]`` argument is not used by NuttX and may be
|
|
``NULL``.
|
|
|
|
:return: ``task_spawn()`` will return zero on success.
|
|
Otherwise, an error number will be returned as the function return value
|
|
to indicate the error:
|
|
|
|
**POSIX Compatibility:** This is a non-standard interface inspired by
|
|
``posix_spawn()``.
|
|
|
|
.. c:function:: int task_spawnattr_getstacksize(FAR const posix_spawnattr_t *attr, FAR size_t *stacksize)
|
|
|
|
The ``task_spawnattr_getstacksize()`` function will
|
|
obtain the value of the *spawn-stacksize* attribute from the attributes
|
|
object referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be queried.
|
|
:param policy: The location to return the *spawn-stacksize* value.
|
|
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|
|
|
|
.. c:function:: int task_spawnattr_setstacksize(FAR posix_spawnattr_t *attr, size_t stacksize)
|
|
|
|
The ``task_spawnattr_setstacksize()`` function will set
|
|
the *spawn-stacksize* attribute in an initialized attributes object
|
|
referenced by ``attr``.
|
|
|
|
:param attr: The address spawn attributes to be used.
|
|
:param policy: The new value of the *spawn-stacksize* attribute.
|
|
:return: On success, this function returns 0; on failure it
|
|
will return an error number from ``<errno.h>``
|