1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-10-23 02:12:24 +03:00

* manual/llio.texi: Document MTASC-safety properties.

This commit is contained in:
Alexandre Oliva
2014-01-31 23:25:06 -02:00
parent d9f0ec97d6
commit 2cc3615ce8
2 changed files with 284 additions and 0 deletions

View File

@@ -1,3 +1,7 @@
2014-01-31 Alexandre Oliva <aoliva@redhat.com>
* manual/llio.texi: Document MTASC-safety properties.
2014-01-31 Alexandre Oliva <aoliva@redhat.com> 2014-01-31 Alexandre Oliva <aoliva@redhat.com>
* manual/libdl.texi: New. * manual/libdl.texi: New.

View File

@@ -78,6 +78,7 @@ declared in @file{unistd.h}.
@comment fcntl.h @comment fcntl.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int open (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}]) @deftypefun int open (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}])
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
The @code{open} function creates and returns a new file descriptor for The @code{open} function creates and returns a new file descriptor for
the file named by @var{filename}. Initially, the file position the file named by @var{filename}. Initially, the file position
indicator for the file is at the beginning of the file. The argument indicator for the file is at the beginning of the file. The argument
@@ -164,6 +165,7 @@ and @code{freopen} functions, that create streams.
@comment fcntl.h @comment fcntl.h
@comment Unix98 @comment Unix98
@deftypefun int open64 (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}]) @deftypefun int open64 (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}])
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
This function is similar to @code{open}. It returns a file descriptor This function is similar to @code{open}. It returns a file descriptor
which can be used to access the file named by @var{filename}. The only which can be used to access the file named by @var{filename}. The only
difference is that on 32 bit systems the file is opened in the difference is that on 32 bit systems the file is opened in the
@@ -178,6 +180,7 @@ replaces the old API.
@comment fcntl.h @comment fcntl.h
@comment POSIX.1 @comment POSIX.1
@deftypefn {Obsolete function} int creat (const char *@var{filename}, mode_t @var{mode}) @deftypefn {Obsolete function} int creat (const char *@var{filename}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
This function is obsolete. The call: This function is obsolete. The call:
@smallexample @smallexample
@@ -202,6 +205,7 @@ since all of the lowlevel file handling functions are equally replaced.
@comment fcntl.h @comment fcntl.h
@comment Unix98 @comment Unix98
@deftypefn {Obsolete function} int creat64 (const char *@var{filename}, mode_t @var{mode}) @deftypefn {Obsolete function} int creat64 (const char *@var{filename}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
This function is similar to @code{creat}. It returns a file descriptor This function is similar to @code{creat}. It returns a file descriptor
which can be used to access the file named by @var{filename}. The only which can be used to access the file named by @var{filename}. The only
the difference is that on 32 bit systems the file is opened in the the difference is that on 32 bit systems the file is opened in the
@@ -219,6 +223,7 @@ replaces the old API.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int close (int @var{filedes}) @deftypefun int close (int @var{filedes})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{@acsfd{}}}
The function @code{close} closes the file descriptor @var{filedes}. The function @code{close} closes the file descriptor @var{filedes}.
Closing a file has the following consequences: Closing a file has the following consequences:
@@ -300,6 +305,7 @@ but must be a signed type.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun ssize_t read (int @var{filedes}, void *@var{buffer}, size_t @var{size}) @deftypefun ssize_t read (int @var{filedes}, void *@var{buffer}, size_t @var{size})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{read} function reads up to @var{size} bytes from the file The @code{read} function reads up to @var{size} bytes from the file
with descriptor @var{filedes}, storing the results in the @var{buffer}. with descriptor @var{filedes}, storing the results in the @var{buffer}.
(This is not necessarily a character string, and no terminating null (This is not necessarily a character string, and no terminating null
@@ -395,6 +401,10 @@ functions that read from streams, such as @code{fgetc}.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun ssize_t pread (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off_t @var{offset}) @deftypefun ssize_t pread (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is usually a safe syscall. The sysdeps/posix fallback emulation
@c is not MT-Safe because it uses lseek, read and lseek back, but is it
@c used anywhere?
The @code{pread} function is similar to the @code{read} function. The The @code{pread} function is similar to the @code{read} function. The
first three arguments are identical, and the return values and error first three arguments are identical, and the return values and error
codes also correspond. codes also correspond.
@@ -430,6 +440,10 @@ version 2.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun ssize_t pread64 (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off64_t @var{offset}) @deftypefun ssize_t pread64 (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off64_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is usually a safe syscall. The sysdeps/posix fallback emulation
@c is not MT-Safe because it uses lseek64, read and lseek64 back, but is
@c it used anywhere?
This function is similar to the @code{pread} function. The difference This function is similar to the @code{pread} function. The difference
is that the @var{offset} parameter is of type @code{off64_t} instead of is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t} which makes it possible on 32 bit machines to address @code{off_t} which makes it possible on 32 bit machines to address
@@ -447,6 +461,7 @@ When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} on a
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun ssize_t write (int @var{filedes}, const void *@var{buffer}, size_t @var{size}) @deftypefun ssize_t write (int @var{filedes}, const void *@var{buffer}, size_t @var{size})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{write} function writes up to @var{size} bytes from The @code{write} function writes up to @var{size} bytes from
@var{buffer} to the file with descriptor @var{filedes}. The data in @var{buffer} to the file with descriptor @var{filedes}. The data in
@var{buffer} is not necessarily a character string and a null character is @var{buffer} is not necessarily a character string and a null character is
@@ -557,6 +572,10 @@ functions that write to streams, such as @code{fputc}.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun ssize_t pwrite (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off_t @var{offset}) @deftypefun ssize_t pwrite (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is usually a safe syscall. The sysdeps/posix fallback emulation
@c is not MT-Safe because it uses lseek, write and lseek back, but is it
@c used anywhere?
The @code{pwrite} function is similar to the @code{write} function. The The @code{pwrite} function is similar to the @code{write} function. The
first three arguments are identical, and the return values and error codes first three arguments are identical, and the return values and error codes
also correspond. also correspond.
@@ -592,6 +611,10 @@ version 2.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun ssize_t pwrite64 (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off64_t @var{offset}) @deftypefun ssize_t pwrite64 (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off64_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is usually a safe syscall. The sysdeps/posix fallback emulation
@c is not MT-Safe because it uses lseek64, write and lseek64 back, but
@c is it used anywhere?
This function is similar to the @code{pwrite} function. The difference This function is similar to the @code{pwrite} function. The difference
is that the @var{offset} parameter is of type @code{off64_t} instead of is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t} which makes it possible on 32 bit machines to address @code{off_t} which makes it possible on 32 bit machines to address
@@ -624,6 +647,7 @@ To read the current file position value from a descriptor, use
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun off_t lseek (int @var{filedes}, off_t @var{offset}, int @var{whence}) @deftypefun off_t lseek (int @var{filedes}, off_t @var{offset}, int @var{whence})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{lseek} function is used to change the file position of the The @code{lseek} function is used to change the file position of the
file with descriptor @var{filedes}. file with descriptor @var{filedes}.
@@ -713,6 +737,7 @@ descriptors.
@comment unistd.h @comment unistd.h
@comment Unix98 @comment Unix98
@deftypefun off64_t lseek64 (int @var{filedes}, off64_t @var{offset}, int @var{whence}) @deftypefun off64_t lseek64 (int @var{filedes}, off64_t @var{offset}, int @var{whence})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is similar to the @code{lseek} function. The difference This function is similar to the @code{lseek} function. The difference
is that the @var{offset} parameter is of type @code{off64_t} instead of is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t} which makes it possible on 32 bit machines to address @code{off_t} which makes it possible on 32 bit machines to address
@@ -825,6 +850,7 @@ declared in the header file @file{stdio.h}.
@comment stdio.h @comment stdio.h
@comment POSIX.1 @comment POSIX.1
@deftypefun {FILE *} fdopen (int @var{filedes}, const char *@var{opentype}) @deftypefun {FILE *} fdopen (int @var{filedes}, const char *@var{opentype})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{} @asulock{}}@acunsafe{@acsmem{} @aculock{}}}
The @code{fdopen} function returns a new stream for the file descriptor The @code{fdopen} function returns a new stream for the file descriptor
@var{filedes}. @var{filedes}.
@@ -853,6 +879,7 @@ see @ref{Creating a Pipe}.
@comment stdio.h @comment stdio.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int fileno (FILE *@var{stream}) @deftypefun int fileno (FILE *@var{stream})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function returns the file descriptor associated with the stream This function returns the file descriptor associated with the stream
@var{stream}. If an error is detected (for example, if the @var{stream} @var{stream}. If an error is detected (for example, if the @var{stream}
is not valid) or if @var{stream} does not do I/O to a file, is not valid) or if @var{stream} does not do I/O to a file,
@@ -862,6 +889,7 @@ is not valid) or if @var{stream} does not do I/O to a file,
@comment stdio.h @comment stdio.h
@comment GNU @comment GNU
@deftypefun int fileno_unlocked (FILE *@var{stream}) @deftypefun int fileno_unlocked (FILE *@var{stream})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{fileno_unlocked} function is equivalent to the @code{fileno} The @code{fileno_unlocked} function is equivalent to the @code{fileno}
function except that it does not implicitly lock the stream if the state function except that it does not implicitly lock the stream if the state
is @code{FSETLOCKING_INTERNAL}. is @code{FSETLOCKING_INTERNAL}.
@@ -1071,6 +1099,11 @@ Contains the length of the buffer.
@comment sys/uio.h @comment sys/uio.h
@comment BSD @comment BSD
@deftypefun ssize_t readv (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) @deftypefun ssize_t readv (int @var{filedes}, const struct iovec *@var{vector}, int @var{count})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@c The fallback sysdeps/posix implementation, used even on GNU/Linux
@c with old kernels that lack a full readv/writev implementation, may
@c malloc the buffer into which data is read, if the total read size is
@c too large for alloca.
The @code{readv} function reads data from @var{filedes} and scatters it The @code{readv} function reads data from @var{filedes} and scatters it
into the buffers described in @var{vector}, which is taken to be into the buffers described in @var{vector}, which is taken to be
@@ -1089,6 +1122,11 @@ errors are the same as in @code{read}.
@comment sys/uio.h @comment sys/uio.h
@comment BSD @comment BSD
@deftypefun ssize_t writev (int @var{filedes}, const struct iovec *@var{vector}, int @var{count}) @deftypefun ssize_t writev (int @var{filedes}, const struct iovec *@var{vector}, int @var{count})
@safety{@prelim{}@mtsafe{}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@c The fallback sysdeps/posix implementation, used even on GNU/Linux
@c with old kernels that lack a full readv/writev implementation, may
@c malloc the buffer from which data is written, if the total write size
@c is too large for alloca.
The @code{writev} function gathers data from the buffers described in The @code{writev} function gathers data from the buffers described in
@var{vector}, which is taken to be @var{count} structures long, and writes @var{vector}, which is taken to be @var{count} structures long, and writes
@@ -1149,6 +1187,7 @@ These functions are declared in @file{sys/mman.h}.
@comment sys/mman.h @comment sys/mman.h
@comment POSIX @comment POSIX
@deftypefun {void *} mmap (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off_t @var{offset}) @deftypefun {void *} mmap (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{mmap} function creates a new mapping, connected to bytes The @code{mmap} function creates a new mapping, connected to bytes
(@var{offset}) to (@var{offset} + @var{length} - 1) in the file open on (@var{offset}) to (@var{offset} + @var{length} - 1) in the file open on
@@ -1268,6 +1307,9 @@ The file is on a filesystem that doesn't support mapping.
@comment sys/mman.h @comment sys/mman.h
@comment LFS @comment LFS
@deftypefun {void *} mmap64 (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off64_t @var{offset}) @deftypefun {void *} mmap64 (void *@var{address}, size_t @var{length}, int @var{protect}, int @var{flags}, int @var{filedes}, off64_t @var{offset})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c The page_shift auto detection when MMAP2_PAGE_SHIFT is -1 (it never
@c is) would be thread-unsafe.
The @code{mmap64} function is equivalent to the @code{mmap} function but The @code{mmap64} function is equivalent to the @code{mmap} function but
the @var{offset} parameter is of type @code{off64_t}. On 32-bit systems the @var{offset} parameter is of type @code{off64_t}. On 32-bit systems
this allows the file associated with the @var{filedes} descriptor to be this allows the file associated with the @var{filedes} descriptor to be
@@ -1284,6 +1326,7 @@ replaces the old API.
@comment sys/mman.h @comment sys/mman.h
@comment POSIX @comment POSIX
@deftypefun int munmap (void *@var{addr}, size_t @var{length}) @deftypefun int munmap (void *@var{addr}, size_t @var{length})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@code{munmap} removes any memory maps from (@var{addr}) to (@var{addr} + @code{munmap} removes any memory maps from (@var{addr}) to (@var{addr} +
@var{length}). @var{length} should be the length of the mapping. @var{length}). @var{length} should be the length of the mapping.
@@ -1310,6 +1353,7 @@ aligned.
@comment sys/mman.h @comment sys/mman.h
@comment POSIX @comment POSIX
@deftypefun int msync (void *@var{address}, size_t @var{length}, int @var{flags}) @deftypefun int msync (void *@var{address}, size_t @var{length}, int @var{flags})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
When using shared mappings, the kernel can write the file at any time When using shared mappings, the kernel can write the file at any time
before the mapping is removed. To be certain data has actually been before the mapping is removed. To be certain data has actually been
@@ -1357,6 +1401,7 @@ There is no existing mapping in at least part of the given region.
@comment sys/mman.h @comment sys/mman.h
@comment GNU @comment GNU
@deftypefun {void *} mremap (void *@var{address}, size_t @var{length}, size_t @var{new_length}, int @var{flag}) @deftypefun {void *} mremap (void *@var{address}, size_t @var{length}, size_t @var{new_length}, int @var{flag})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function can be used to change the size of an existing memory This function can be used to change the size of an existing memory
area. @var{address} and @var{length} must cover a region entirely mapped area. @var{address} and @var{length} must cover a region entirely mapped
@@ -1405,6 +1450,7 @@ Coding Standards}.
@comment sys/mman.h @comment sys/mman.h
@comment POSIX @comment POSIX
@deftypefun int madvise (void *@var{addr}, size_t @var{length}, int @var{advice}) @deftypefun int madvise (void *@var{addr}, size_t @var{length}, int @var{advice})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function can be used to provide the system with @var{advice} about This function can be used to provide the system with @var{advice} about
the intended usage patterns of the memory region starting at @var{addr} the intended usage patterns of the memory region starting at @var{addr}
@@ -1474,6 +1520,24 @@ There is no existing mapping in at least part of the given region.
@comment sys/mman.h @comment sys/mman.h
@comment POSIX @comment POSIX
@deftypefn Function int shm_open (const char *@var{name}, int @var{oflag}, mode_t @var{mode}) @deftypefn Function int shm_open (const char *@var{name}, int @var{oflag}, mode_t @var{mode})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asuinit{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}}
@c shm_open @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd
@c libc_once(where_is_shmfs) @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd
@c where_is_shmfs @mtslocale @ascuheap @asulock @aculock @acsmem @acsfd
@c statfs dup ok
@c setmntent dup @ascuheap @asulock @acsmem @acsfd @aculock
@c getmntent_r dup @mtslocale @ascuheap @aculock @acsmem [no @asucorrupt @acucorrupt; exclusive stream]
@c strcmp dup ok
@c strlen dup ok
@c malloc dup @ascuheap @acsmem
@c mempcpy dup ok
@c endmntent dup @ascuheap @asulock @aculock @acsmem @acsfd
@c strlen dup ok
@c strchr dup ok
@c mempcpy dup ok
@c open dup @acsfd
@c fcntl dup ok
@c close dup @acsfd
This function returns a file descriptor that can be used to allocate shared This function returns a file descriptor that can be used to allocate shared
memory via mmap. Unrelated processes can use same @var{name} to create or memory via mmap. Unrelated processes can use same @var{name} to create or
@@ -1490,6 +1554,13 @@ On failure @code{errno} is set.
@end deftypefn @end deftypefn
@deftypefn Function int shm_unlink (const char *@var{name}) @deftypefn Function int shm_unlink (const char *@var{name})
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@asuinit{} @ascuheap{} @asulock{}}@acunsafe{@aculock{} @acsmem{} @acsfd{}}}
@c shm_unlink @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd
@c libc_once(where_is_shmfs) dup @mtslocale @asuinit @ascuheap @asulock @aculock @acsmem @acsfd
@c strlen dup ok
@c strchr dup ok
@c mempcpy dup ok
@c unlink dup ok
This function is inverse of @code{shm_open} and removes the object with This function is inverse of @code{shm_open} and removes the object with
the given @var{name} previously created by @code{shm_open}. the given @var{name} previously created by @code{shm_open}.
@@ -1558,6 +1629,7 @@ that descriptor into an @code{fd_set}.
@comment sys/types.h @comment sys/types.h
@comment BSD @comment BSD
@deftypefn Macro void FD_ZERO (fd_set *@var{set}) @deftypefn Macro void FD_ZERO (fd_set *@var{set})
@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}}
This macro initializes the file descriptor set @var{set} to be the This macro initializes the file descriptor set @var{set} to be the
empty set. empty set.
@end deftypefn @end deftypefn
@@ -1565,6 +1637,9 @@ empty set.
@comment sys/types.h @comment sys/types.h
@comment BSD @comment BSD
@deftypefn Macro void FD_SET (int @var{filedes}, fd_set *@var{set}) @deftypefn Macro void FD_SET (int @var{filedes}, fd_set *@var{set})
@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}}
@c Setting a bit isn't necessarily atomic, so there's a potential race
@c here if set is not used exclusively.
This macro adds @var{filedes} to the file descriptor set @var{set}. This macro adds @var{filedes} to the file descriptor set @var{set}.
The @var{filedes} parameter must not have side effects since it is The @var{filedes} parameter must not have side effects since it is
@@ -1574,6 +1649,9 @@ evaluated more than once.
@comment sys/types.h @comment sys/types.h
@comment BSD @comment BSD
@deftypefn Macro void FD_CLR (int @var{filedes}, fd_set *@var{set}) @deftypefn Macro void FD_CLR (int @var{filedes}, fd_set *@var{set})
@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}}
@c Setting a bit isn't necessarily atomic, so there's a potential race
@c here if set is not used exclusively.
This macro removes @var{filedes} from the file descriptor set @var{set}. This macro removes @var{filedes} from the file descriptor set @var{set}.
The @var{filedes} parameter must not have side effects since it is The @var{filedes} parameter must not have side effects since it is
@@ -1583,6 +1661,7 @@ evaluated more than once.
@comment sys/types.h @comment sys/types.h
@comment BSD @comment BSD
@deftypefn Macro int FD_ISSET (int @var{filedes}, const fd_set *@var{set}) @deftypefn Macro int FD_ISSET (int @var{filedes}, const fd_set *@var{set})
@safety{@prelim{}@mtsafe{@mtsrace{:set}}@assafe{}@acsafe{}}
This macro returns a nonzero value (true) if @var{filedes} is a member This macro returns a nonzero value (true) if @var{filedes} is a member
of the file descriptor set @var{set}, and zero (false) otherwise. of the file descriptor set @var{set}, and zero (false) otherwise.
@@ -1595,6 +1674,10 @@ Next, here is the description of the @code{select} function itself.
@comment sys/types.h @comment sys/types.h
@comment BSD @comment BSD
@deftypefun int select (int @var{nfds}, fd_set *@var{read-fds}, fd_set *@var{write-fds}, fd_set *@var{except-fds}, struct timeval *@var{timeout}) @deftypefun int select (int @var{nfds}, fd_set *@var{read-fds}, fd_set *@var{write-fds}, fd_set *@var{except-fds}, struct timeval *@var{timeout})
@safety{@prelim{}@mtsafe{@mtsrace{:read-fds} @mtsrace{:write-fds} @mtsrace{:except-fds}}@assafe{}@acsafe{}}
@c The select syscall is preferred, but pselect6 may be used instead,
@c which requires converting timeout to a timespec and back. The
@c conversions are not atomic.
The @code{select} function blocks the calling process until there is The @code{select} function blocks the calling process until there is
activity on any of the specified sets of file descriptors, or until the activity on any of the specified sets of file descriptors, or until the
timeout period has expired. timeout period has expired.
@@ -1697,6 +1780,7 @@ they return.
@comment unistd.h @comment unistd.h
@comment X/Open @comment X/Open
@deftypefun void sync (void) @deftypefun void sync (void)
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
A call to this function will not return as long as there is data which A call to this function will not return as long as there is data which
has not been written to the device. All dirty buffers in the kernel will has not been written to the device. All dirty buffers in the kernel will
be written and so an overall consistent system can be achieved (if no be written and so an overall consistent system can be achieved (if no
@@ -1712,6 +1796,7 @@ committed, rather than all data in the system. For this, @code{sync} is overkil
@comment unistd.h @comment unistd.h
@comment POSIX @comment POSIX
@deftypefun int fsync (int @var{fildes}) @deftypefun int fsync (int @var{fildes})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{fsync} function can be used to make sure all data associated with The @code{fsync} function can be used to make sure all data associated with
the open file @var{fildes} is written to the device associated with the the open file @var{fildes} is written to the device associated with the
descriptor. The function call does not return unless all actions have descriptor. The function call does not return unless all actions have
@@ -1749,6 +1834,7 @@ recovering of the file in case of a problem.
@comment unistd.h @comment unistd.h
@comment POSIX @comment POSIX
@deftypefun int fdatasync (int @var{fildes}) @deftypefun int fdatasync (int @var{fildes})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
When a call to the @code{fdatasync} function returns, it is ensured When a call to the @code{fdatasync} function returns, it is ensured
that all of the file data is written to the device. For all pending I/O that all of the file data is written to the device. For all pending I/O
operations, the parts guaranteeing data integrity finished. operations, the parts guaranteeing data integrity finished.
@@ -1950,6 +2036,158 @@ aiocb64}, since the LFS transparently replaces the old interface.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_read (struct aiocb *@var{aiocbp}) @deftypefun int aio_read (struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
@c Calls aio_enqueue_request.
@c aio_enqueue_request @asulock @ascuheap @aculock @acsmem
@c pthread_self ok
@c pthread_getschedparam @asulock @aculock
@c lll_lock (pthread descriptor's lock) @asulock @aculock
@c sched_getparam ok
@c sched_getscheduler ok
@c lll_unlock @aculock
@c pthread_mutex_lock (aio_requests_mutex) @asulock @aculock
@c get_elem @ascuheap @acsmem [@asucorrupt @acucorrupt]
@c realloc @ascuheap @acsmem
@c calloc @ascuheap @acsmem
@c aio_create_helper_thread @asulock @ascuheap @aculock @acsmem
@c pthread_attr_init ok
@c pthread_attr_setdetachstate ok
@c pthread_get_minstack ok
@c pthread_attr_setstacksize ok
@c sigfillset ok
@c memset ok
@c sigdelset ok
@c SYSCALL rt_sigprocmask ok
@c pthread_create @asulock @ascuheap @aculock @acsmem
@c lll_lock (default_pthread_attr_lock) @asulock @aculock
@c alloca/malloc @ascuheap @acsmem
@c lll_unlock @aculock
@c allocate_stack @asulock @ascuheap @aculock @acsmem
@c getpagesize dup
@c lll_lock (default_pthread_attr_lock) @asulock @aculock
@c lll_unlock @aculock
@c _dl_allocate_tls @ascuheap @acsmem
@c _dl_allocate_tls_storage @ascuheap @acsmem
@c memalign @ascuheap @acsmem
@c memset ok
@c allocate_dtv dup
@c free @ascuheap @acsmem
@c allocate_dtv @ascuheap @acsmem
@c calloc @ascuheap @acsmem
@c INSTALL_DTV ok
@c list_add dup
@c get_cached_stack
@c lll_lock (stack_cache_lock) @asulock @aculock
@c list_for_each ok
@c list_entry dup
@c FREE_P dup
@c stack_list_del dup
@c stack_list_add dup
@c lll_unlock @aculock
@c _dl_allocate_tls_init ok
@c GET_DTV ok
@c mmap ok
@c atomic_increment_val ok
@c munmap ok
@c change_stack_perm ok
@c mprotect ok
@c mprotect ok
@c stack_list_del dup
@c _dl_deallocate_tls dup
@c munmap ok
@c THREAD_COPY_STACK_GUARD ok
@c THREAD_COPY_POINTER_GUARD ok
@c atomic_exchange_acq ok
@c lll_futex_wake ok
@c deallocate_stack @asulock @ascuheap @aculock @acsmem
@c lll_lock (state_cache_lock) @asulock @aculock
@c stack_list_del ok
@c atomic_write_barrier ok
@c list_del ok
@c atomic_write_barrier ok
@c queue_stack @ascuheap @acsmem
@c stack_list_add ok
@c atomic_write_barrier ok
@c list_add ok
@c atomic_write_barrier ok
@c free_stacks @ascuheap @acsmem
@c list_for_each_prev_safe ok
@c list_entry ok
@c FREE_P ok
@c stack_list_del dup
@c _dl_deallocate_tls dup
@c munmap ok
@c _dl_deallocate_tls @ascuheap @acsmem
@c free @ascuheap @acsmem
@c lll_unlock @aculock
@c create_thread @asulock @ascuheap @aculock @acsmem
@c td_eventword
@c td_eventmask
@c do_clone @asulock @ascuheap @aculock @acsmem
@c PREPARE_CREATE ok
@c lll_lock (pd->lock) @asulock @aculock
@c atomic_increment ok
@c clone ok
@c atomic_decrement ok
@c atomic_exchange_acq ok
@c lll_futex_wake ok
@c deallocate_stack dup
@c sched_setaffinity ok
@c tgkill ok
@c sched_setscheduler ok
@c atomic_compare_and_exchange_bool_acq ok
@c nptl_create_event ok
@c lll_unlock (pd->lock) @aculock
@c free @ascuheap @acsmem
@c pthread_attr_destroy ok (cpuset won't be set, so free isn't called)
@c add_request_to_runlist ok
@c pthread_cond_signal ok
@c aio_free_request ok
@c pthread_mutex_unlock @aculock
@c (in the new thread, initiated with clone)
@c start_thread ok
@c HP_TIMING_NOW ok
@c ctype_init @mtslocale
@c atomic_exchange_acq ok
@c lll_futex_wake ok
@c sigemptyset ok
@c sigaddset ok
@c setjmp ok
@c CANCEL_ASYNC -> pthread_enable_asynccancel ok
@c do_cancel ok
@c pthread_unwind ok
@c Unwind_ForcedUnwind or longjmp ok [@ascuheap @acsmem?]
@c lll_lock @asulock @aculock
@c lll_unlock @asulock @aculock
@c CANCEL_RESET -> pthread_disable_asynccancel ok
@c lll_futex_wait ok
@c ->start_routine ok -----
@c call_tls_dtors @asulock @ascuheap @aculock @acsmem
@c user-supplied dtor
@c rtld_lock_lock_recursive (dl_load_lock) @asulock @aculock
@c rtld_lock_unlock_recursive @aculock
@c free @ascuheap @acsmem
@c nptl_deallocate_tsd @ascuheap @acsmem
@c tsd user-supplied dtors ok
@c free @ascuheap @acsmem
@c libc_thread_freeres
@c libc_thread_subfreeres ok
@c atomic_decrement_and_test ok
@c td_eventword ok
@c td_eventmask ok
@c atomic_compare_exchange_bool_acq ok
@c nptl_death_event ok
@c lll_robust_dead ok
@c getpagesize ok
@c madvise ok
@c free_tcb @asulock @ascuheap @aculock @acsmem
@c free @ascuheap @acsmem
@c deallocate_stack @asulock @ascuheap @aculock @acsmem
@c lll_futex_wait ok
@c exit_thread_inline ok
@c syscall(exit) ok
This function initiates an asynchronous read operation. It This function initiates an asynchronous read operation. It
immediately returns after the operation was enqueued or when an immediately returns after the operation was enqueued or when an
error was encountered. error was encountered.
@@ -2015,6 +2253,7 @@ replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_read64 (struct aiocb64 *@var{aiocbp}) @deftypefun int aio_read64 (struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function is similar to the @code{aio_read} function. The only This function is similar to the @code{aio_read} function. The only
difference is that on @w{32 bit} machines, the file descriptor should difference is that on @w{32 bit} machines, the file descriptor should
be opened in the large file mode. Internally, @code{aio_read64} uses be opened in the large file mode. Internally, @code{aio_read64} uses
@@ -2033,6 +2272,7 @@ of functions with a very similar interface.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_write (struct aiocb *@var{aiocbp}) @deftypefun int aio_write (struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function initiates an asynchronous write operation. The function This function initiates an asynchronous write operation. The function
call immediately returns after the operation was enqueued or if before call immediately returns after the operation was enqueued or if before
this happens an error was encountered. this happens an error was encountered.
@@ -2099,6 +2339,7 @@ replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_write64 (struct aiocb64 *@var{aiocbp}) @deftypefun int aio_write64 (struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function is similar to the @code{aio_write} function. The only This function is similar to the @code{aio_write} function. The only
difference is that on @w{32 bit} machines the file descriptor should difference is that on @w{32 bit} machines the file descriptor should
be opened in the large file mode. Internally @code{aio_write64} uses be opened in the large file mode. Internally @code{aio_write64} uses
@@ -2120,6 +2361,12 @@ operations. It is therefore similar to a combination of @code{readv} and
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int lio_listio (int @var{mode}, struct aiocb *const @var{list}[], int @var{nent}, struct sigevent *@var{sig}) @deftypefun int lio_listio (int @var{mode}, struct aiocb *const @var{list}[], int @var{nent}, struct sigevent *@var{sig})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
@c Call lio_listio_internal, that takes the aio_requests_mutex lock and
@c enqueues each request. Then, it waits for notification or prepares
@c for it before releasing the lock. Even though it performs memory
@c allocation and locking of its own, it doesn't add any classes of
@c safety issues that aren't already covered by aio_enqueue_request.
The @code{lio_listio} function can be used to enqueue an arbitrary The @code{lio_listio} function can be used to enqueue an arbitrary
number of read and write requests at one time. The requests can all be number of read and write requests at one time. The requests can all be
meant for the same file, all for different files or every solution in meant for the same file, all for different files or every solution in
@@ -2203,6 +2450,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int lio_listio64 (int @var{mode}, struct aiocb64 *const @var{list}[], int @var{nent}, struct sigevent *@var{sig}) @deftypefun int lio_listio64 (int @var{mode}, struct aiocb64 *const @var{list}[], int @var{nent}, struct sigevent *@var{sig})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function is similar to the @code{lio_listio} function. The only This function is similar to the @code{lio_listio} function. The only
difference is that on @w{32 bit} machines, the file descriptor should difference is that on @w{32 bit} machines, the file descriptor should
be opened in the large file mode. Internally, @code{lio_listio64} uses be opened in the large file mode. Internally, @code{lio_listio64} uses
@@ -2231,6 +2479,7 @@ The following two functions allow you to get this kind of information.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_error (const struct aiocb *@var{aiocbp}) @deftypefun int aio_error (const struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function determines the error state of the request described by the This function determines the error state of the request described by the
@code{struct aiocb} variable pointed to by @var{aiocbp}. If the @code{struct aiocb} variable pointed to by @var{aiocbp}. If the
request has not yet terminated the value returned is always request has not yet terminated the value returned is always
@@ -2252,6 +2501,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_error64 (const struct aiocb64 *@var{aiocbp}) @deftypefun int aio_error64 (const struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is similar to @code{aio_error} with the only difference This function is similar to @code{aio_error} with the only difference
that the argument is a reference to a variable of type @code{struct that the argument is a reference to a variable of type @code{struct
aiocb64}. aiocb64}.
@@ -2265,6 +2515,7 @@ machines.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun ssize_t aio_return (struct aiocb *@var{aiocbp}) @deftypefun ssize_t aio_return (struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function can be used to retrieve the return status of the operation This function can be used to retrieve the return status of the operation
carried out by the request described in the variable pointed to by carried out by the request described in the variable pointed to by
@var{aiocbp}. As long as the error status of this request as returned @var{aiocbp}. As long as the error status of this request as returned
@@ -2288,6 +2539,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun ssize_t aio_return64 (struct aiocb64 *@var{aiocbp}) @deftypefun ssize_t aio_return64 (struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function is similar to @code{aio_return} with the only difference This function is similar to @code{aio_return} with the only difference
that the argument is a reference to a variable of type @code{struct that the argument is a reference to a variable of type @code{struct
aiocb64}. aiocb64}.
@@ -2316,6 +2568,9 @@ if the symbol @code{_POSIX_SYNCHRONIZED_IO} is defined in @file{unistd.h}.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_fsync (int @var{op}, struct aiocb *@var{aiocbp}) @deftypefun int aio_fsync (int @var{op}, struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
@c After fcntl to check that the FD is open, it calls
@c aio_enqueue_request.
Calling this function forces all I/O operations operating queued at the Calling this function forces all I/O operations operating queued at the
time of the function call operating on the file descriptor time of the function call operating on the file descriptor
@code{aiocbp->aio_fildes} into the synchronized I/O completion state @code{aiocbp->aio_fildes} into the synchronized I/O completion state
@@ -2363,6 +2618,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_fsync64 (int @var{op}, struct aiocb64 *@var{aiocbp}) @deftypefun int aio_fsync64 (int @var{op}, struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function is similar to @code{aio_fsync} with the only difference This function is similar to @code{aio_fsync} with the only difference
that the argument is a reference to a variable of type @code{struct that the argument is a reference to a variable of type @code{struct
aiocb64}. aiocb64}.
@@ -2389,6 +2645,9 @@ before the current client is served. For situations like this
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_suspend (const struct aiocb *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout}) @deftypefun int aio_suspend (const struct aiocb *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c Take aio_requests_mutex, set up waitlist and requestlist, wait
@c for completion or timeout, and release the mutex.
When calling this function, the calling thread is suspended until at When calling this function, the calling thread is suspended until at
least one of the requests pointed to by the @var{nent} elements of the least one of the requests pointed to by the @var{nent} elements of the
array @var{list} has completed. If any of the requests has already array @var{list} has completed. If any of the requests has already
@@ -2427,6 +2686,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_suspend64 (const struct aiocb64 *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout}) @deftypefun int aio_suspend64 (const struct aiocb64 *const @var{list}[], int @var{nent}, const struct timespec *@var{timeout})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
This function is similar to @code{aio_suspend} with the only difference This function is similar to @code{aio_suspend} with the only difference
that the argument is a reference to a variable of type @code{struct that the argument is a reference to a variable of type @code{struct
aiocb64}. aiocb64}.
@@ -2454,6 +2714,16 @@ or not. Therefore using this function is merely a hint.
@comment aio.h @comment aio.h
@comment POSIX.1b @comment POSIX.1b
@deftypefun int aio_cancel (int @var{fildes}, struct aiocb *@var{aiocbp}) @deftypefun int aio_cancel (int @var{fildes}, struct aiocb *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
@c After fcntl to check the fd is open, hold aio_requests_mutex, call
@c aio_find_req_fd, aio_remove_request, then aio_notify and
@c aio_free_request each request before releasing the lock.
@c aio_notify calls aio_notify_only and free, besides cond signal or
@c similar. aio_notify_only calls pthread_attr_init,
@c pthread_attr_setdetachstate, malloc, pthread_create,
@c notify_func_wrapper, aio_sigqueue, getpid, raise.
@c notify_func_wraper calls aio_start_notify_thread, free and then the
@c notifier function.
The @code{aio_cancel} function can be used to cancel one or more The @code{aio_cancel} function can be used to cancel one or more
outstanding requests. If the @var{aiocbp} parameter is @code{NULL}, the outstanding requests. If the @var{aiocbp} parameter is @code{NULL}, the
function tries to cancel all of the outstanding requests which would process function tries to cancel all of the outstanding requests which would process
@@ -2501,6 +2771,7 @@ transparently replaces the normal implementation.
@comment aio.h @comment aio.h
@comment Unix98 @comment Unix98
@deftypefun int aio_cancel64 (int @var{fildes}, struct aiocb64 *@var{aiocbp}) @deftypefun int aio_cancel64 (int @var{fildes}, struct aiocb64 *@var{aiocbp})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{} @ascuheap{}}@acunsafe{@aculock{} @acsmem{}}}
This function is similar to @code{aio_cancel} with the only difference This function is similar to @code{aio_cancel} with the only difference
that the argument is a reference to a variable of type @code{struct that the argument is a reference to a variable of type @code{struct
aiocb64}. aiocb64}.
@@ -2556,6 +2827,8 @@ Unused.
@comment aio.h @comment aio.h
@comment GNU @comment GNU
@deftypefun void aio_init (const struct aioinit *@var{init}) @deftypefun void aio_init (const struct aioinit *@var{init})
@safety{@prelim{}@mtsafe{}@asunsafe{@asulock{}}@acunsafe{@aculock{}}}
@c All changes to global objects are guarded by aio_requests_mutex.
This function must be called before any other AIO function. Calling it This function must be called before any other AIO function. Calling it
is completely voluntary, as it is only meant to help the AIO is completely voluntary, as it is only meant to help the AIO
implementation perform better. implementation perform better.
@@ -2590,6 +2863,7 @@ function; see @ref{Opening and Closing Files}.
@comment fcntl.h @comment fcntl.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int fcntl (int @var{filedes}, int @var{command}, @dots{}) @deftypefun int fcntl (int @var{filedes}, int @var{command}, @dots{})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{fcntl} function performs the operation specified by The @code{fcntl} function performs the operation specified by
@var{command} on the file descriptor @var{filedes}. Some commands @var{command} on the file descriptor @var{filedes}. Some commands
require additional arguments to be supplied. These additional arguments require additional arguments to be supplied. These additional arguments
@@ -2672,6 +2946,7 @@ while prototypes for @code{dup} and @code{dup2} are in the header file
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int dup (int @var{old}) @deftypefun int dup (int @var{old})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function copies descriptor @var{old} to the first available This function copies descriptor @var{old} to the first available
descriptor number (the first number not currently open). It is descriptor number (the first number not currently open). It is
equivalent to @code{fcntl (@var{old}, F_DUPFD, 0)}. equivalent to @code{fcntl (@var{old}, F_DUPFD, 0)}.
@@ -2680,6 +2955,7 @@ equivalent to @code{fcntl (@var{old}, F_DUPFD, 0)}.
@comment unistd.h @comment unistd.h
@comment POSIX.1 @comment POSIX.1
@deftypefun int dup2 (int @var{old}, int @var{new}) @deftypefun int dup2 (int @var{old}, int @var{new})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
This function copies the descriptor @var{old} to descriptor number This function copies the descriptor @var{old} to descriptor number
@var{new}. @var{new}.
@@ -3658,6 +3934,7 @@ different headers.
@comment sys/ioctl.h @comment sys/ioctl.h
@comment BSD @comment BSD
@deftypefun int ioctl (int @var{filedes}, int @var{command}, @dots{}) @deftypefun int ioctl (int @var{filedes}, int @var{command}, @dots{})
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
The @code{ioctl} function performs the generic I/O operation The @code{ioctl} function performs the generic I/O operation
@var{command} on @var{filedes}. @var{command} on @var{filedes}.
@@ -3677,3 +3954,6 @@ unknown device.
Most IOCTLs are OS-specific and/or only used in special system utilities, Most IOCTLs are OS-specific and/or only used in special system utilities,
and are thus beyond the scope of this document. For an example of the use and are thus beyond the scope of this document. For an example of the use
of an IOCTL, see @ref{Out-of-Band Data}. of an IOCTL, see @ref{Out-of-Band Data}.
@c FIXME this is undocumented:
@c dup3