mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
Update.
1999-08-27 Ulrich Drepper <drepper@cygnus.com> * manual/argp.texi: Fixing language and types. * manual/conf.texi: Likewise. * manual/contrib.texi: Likewise. * manual/filesys.texi: Likewise. * manual/install.texi: Likewise. * manual/job.texi: Likewise. * manual/lang.texi: Likewise. * manual/llio.texi: Likewise. * manual/math.texi: Likewise. * manual/nss.texi: Likewise. * manual/pipe.texi: Likewise. * manual/signal.texi: Likewise. * manual/socket.texi: Likewise. * manual/stdio.texi: Likewise. * manual/sysinfo.texi: Likewise. * manual/users.texi: Likewise. Patches by Neil Booth <NeilB@earthling.net>.
This commit is contained in:
parent
77faa35416
commit
04b9968b39
20
ChangeLog
20
ChangeLog
@ -1,3 +1,23 @@
|
||||
1999-08-27 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* manual/argp.texi: Fixing language and types.
|
||||
* manual/conf.texi: Likewise.
|
||||
* manual/contrib.texi: Likewise.
|
||||
* manual/filesys.texi: Likewise.
|
||||
* manual/install.texi: Likewise.
|
||||
* manual/job.texi: Likewise.
|
||||
* manual/lang.texi: Likewise.
|
||||
* manual/llio.texi: Likewise.
|
||||
* manual/math.texi: Likewise.
|
||||
* manual/nss.texi: Likewise.
|
||||
* manual/pipe.texi: Likewise.
|
||||
* manual/signal.texi: Likewise.
|
||||
* manual/socket.texi: Likewise.
|
||||
* manual/stdio.texi: Likewise.
|
||||
* manual/sysinfo.texi: Likewise.
|
||||
* manual/users.texi: Likewise.
|
||||
Patches by Neil Booth <NeilB@earthling.net>.
|
||||
|
||||
1999-08-25 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* sysdeps/i386/fpu/bits/mathinline.h (__finite): Mark constant as
|
||||
|
@ -112,7 +112,7 @@ flag is used).
|
||||
@comment GNU
|
||||
@deftypevar {const char *} argp_program_bug_address
|
||||
If defined or set by the user program to a non-zero value,
|
||||
@code{argp_program_bug_address} should point to string that is the
|
||||
@code{argp_program_bug_address} should point to a string that is the
|
||||
bug-reporting address for the program. It will be printed at the end of
|
||||
the standard output for the @samp{--help} option, embedded in a sentence
|
||||
that says something like @samp{Report bugs to @var{address}.}.
|
||||
@ -180,7 +180,7 @@ If non-zero, a string describing what non-option arguments are wanted by
|
||||
this parser; it is only used to print the @samp{Usage:} message. If it
|
||||
contains newlines, the strings separated by them are considered
|
||||
alternative usage patterns, and printed on separate lines (lines after
|
||||
the first are prefix by @samp{ or: } instead of @samp{Usage:}).
|
||||
the first are prefixed by @samp{ or: } instead of @samp{Usage:}).
|
||||
|
||||
@item const char *doc
|
||||
If non-zero, a string containing extra text to be printed before and
|
||||
|
@ -446,7 +446,7 @@ Inquire about the parameter corresponding to @code{_POSIX_SEMAPHORES}.
|
||||
@comment unistd.h
|
||||
@comment POSIX.1
|
||||
@item _SC_SHARED_MEMORY_OBJECTS
|
||||
Inquire about the parameter corresponding to
|
||||
Inquire about the parameter corresponding to@*
|
||||
@code{_POSIX_SHARED_MEMORY_OBJECTS}.
|
||||
|
||||
@comment unistd.h
|
||||
@ -580,7 +580,7 @@ Inquire about the parameter corresponding to @code{_POSIX_THREADS}.
|
||||
@comment unistd.h
|
||||
@comment POSIX.1
|
||||
@item _SC_THREAD_SAFE_FUNCTIONS
|
||||
Inquire about the parameter corresponding to
|
||||
Inquire about the parameter corresponding to@*
|
||||
@code{_POSIX_THREAD_SAFE_FUNCTIONS}.
|
||||
|
||||
@comment unistd.h
|
||||
@ -627,13 +627,13 @@ Inquire about the parameter corresponding to @code{_POSIX_THREAD_THREADS_MAX}.
|
||||
@comment unistd.h
|
||||
@comment POSIX.1
|
||||
@item _SC_THREAD_ATTR_STACKADDR
|
||||
Inquire about the parameter corresponding to
|
||||
Inquire about the parameter corresponding to@*a
|
||||
@code{_POSIX_THREAD_ATTR_STACKADDR}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment POSIX.1
|
||||
@item _SC_THREAD_ATTR_STACKSIZE
|
||||
Inquire about the parameter corresponding to
|
||||
Inquire about the parameter corresponding to@*
|
||||
@code{_POSIX_THREAD_ATTR_STACKSIZE}.
|
||||
|
||||
@comment unistd.h
|
||||
@ -760,27 +760,27 @@ Inquire about the virtual memory page size of the machine.
|
||||
@comment unistd.h
|
||||
@comment GNU
|
||||
@item _SC_NPROCESSORS_CONF
|
||||
Inquire about number of configured processors.
|
||||
Inquire about the number of configured processors.
|
||||
|
||||
@comment unistd.h
|
||||
@comment GNU
|
||||
@item _SC_NPROCESSORS_ONLN
|
||||
Inquire about number of processors online.
|
||||
Inquire about the number of processors online.
|
||||
|
||||
@comment unistd.h
|
||||
@comment GNU
|
||||
@item _SC_PHYS_PAGES
|
||||
Inquire about number of physical pages in the system.
|
||||
Inquire about the number of physical pages in the system.
|
||||
|
||||
@comment unistd.h
|
||||
@comment GNU
|
||||
@item _SC_AVPHYS_PAGES
|
||||
Inquire about number of available physical pages in the system.
|
||||
Inquire about the number of available physical pages in the system.
|
||||
|
||||
@comment unistd.h
|
||||
@comment GNU
|
||||
@item _SC_ATEXIT_MAX
|
||||
Inquire about number of functions which can be registered as termination
|
||||
Inquire about the number of functions which can be registered as termination
|
||||
functions for @code{atexit}; @pxref{Cleanups on Exit}.
|
||||
|
||||
@comment unistd.h
|
||||
@ -831,41 +831,41 @@ Inquire about the parameter corresponding to @code{_XOPEN_XPG4}.
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_CHAR_BIT
|
||||
Inquire about number of bits in a variable of type @code{char}.
|
||||
Inquire about the number of bits in a variable of type @code{char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_CHAR_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_CHAR_MIN
|
||||
Inquire about minimum value which can be stored in a variable of type
|
||||
Inquire about the minimum value which can be stored in a variable of type
|
||||
@code{char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_INT_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_INT_MIN
|
||||
Inquire about minimum value which can be stored in a variable of type
|
||||
Inquire about the minimum value which can be stored in a variable of type
|
||||
@code{int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_LONG_BIT
|
||||
Inquire about number of bits in a variable of type @code{long int}.
|
||||
Inquire about the number of bits in a variable of type @code{long int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_WORD_BIT
|
||||
Inquire about number of bits in a variable of a register word.
|
||||
Inquire about the number of bits in a variable of a register word.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@ -876,61 +876,61 @@ character value.
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_NZERO
|
||||
Inquire value used to internally represent the zero priority level for
|
||||
Inquire about the value used to internally represent the zero priority level for
|
||||
the process execution.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item SC_SSIZE_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{ssize_t}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_SCHAR_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{signed char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_SCHAR_MIN
|
||||
Inquire about minimum value which can be stored in a variable of type
|
||||
Inquire about the minimum value which can be stored in a variable of type
|
||||
@code{signed char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_SHRT_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{short int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_SHRT_MIN
|
||||
Inquire about minimum value which can be stored in a variable of type
|
||||
Inquire about the minimum value which can be stored in a variable of type
|
||||
@code{short int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_UCHAR_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{unsigned char}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_UINT_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{unsigned int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_ULONG_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{unsigned long int}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_USHRT_MAX
|
||||
Inquire about maximum value which can be stored in a variable of type
|
||||
Inquire about the maximum value which can be stored in a variable of type
|
||||
@code{unsigned short int}.
|
||||
|
||||
@comment unistd.h
|
||||
@ -956,12 +956,12 @@ Inquire about the parameter corresponding to @code{NL_NMAX}.
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_NL_SETMAX
|
||||
Inquire about the parameter corresponding to @code{NL_SETMAX}.
|
||||
Inquire about the parameter corresponding to @code{NL_SETMAX}.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@item _SC_NL_TEXTMAX
|
||||
Inquire about the parameter corresponding to @code{NL_TEXTMAX}.
|
||||
Inquire about the parameter corresponding to @code{NL_TEXTMAX}.
|
||||
@end table
|
||||
|
||||
@node Examples of Sysconf
|
||||
@ -1023,7 +1023,7 @@ system you are using can go that far.
|
||||
The most restrictive limit permitted by POSIX for the maximum number of
|
||||
I/O operations that can be specified in a list I/O call. The value of
|
||||
this constant is @code{2}; thus you can add up to two new entries
|
||||
of the list of outstandard operations.
|
||||
of the list of outstanding operations.
|
||||
|
||||
@comment limits.h
|
||||
@comment POSIX.1
|
||||
@ -1191,7 +1191,7 @@ that big! Use dynamic allocation (@pxref{Memory Allocation}) instead.
|
||||
POSIX defines certain system-specific options in the system calls for
|
||||
operating on files. Some systems support these options and others do
|
||||
not. Since these options are provided in the kernel, not in the
|
||||
library, simply using the GNU C library does not guarantee any of these
|
||||
library, simply using the GNU C library does not guarantee that any of these
|
||||
features is supported; it depends on the system you are using. They can
|
||||
also vary between file systems on a single machine.
|
||||
|
||||
|
@ -8,7 +8,7 @@ contributed or worked on by other people.
|
||||
|
||||
@itemize @bullet
|
||||
@item
|
||||
The @code{getopt} function and related code were written by
|
||||
The @code{getopt} function and related code was written by
|
||||
Richard Stallman, @w{David J.} MacKenzie, and @w{Roland McGrath}.
|
||||
|
||||
@item
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -49,8 +49,8 @@ GNU Make, and possibly others. @xref{Tools for Compilation}, below.
|
||||
@cindex configuring
|
||||
@cindex compiling
|
||||
|
||||
GNU Libc can be compiled in the source directory but we strongly advise to
|
||||
build in a separate build directory. For example, if you have unpacked
|
||||
GNU libc can be compiled in the source directory, but we strongly advise to
|
||||
build it in a separate build directory. For example, if you have unpacked
|
||||
the glibc sources in @file{/src/gnu/glibc-2.1.0}, create a directory
|
||||
@file{/src/gnu/glibc-build} to put the object files in. This allows to
|
||||
remove the whole build directory in case an error occurs which is the
|
||||
@ -64,7 +64,7 @@ $ ../glibc-2.1.0/configure @var{args...}
|
||||
@end smallexample
|
||||
|
||||
Please note that even if you're building in a separate build directory,
|
||||
the compiliation needs to modify a few files in the source
|
||||
the compilation needs to modify a few files in the source
|
||||
directory, especially some files in the manual subdirectory.
|
||||
|
||||
@noindent
|
||||
@ -74,14 +74,14 @@ only two: @samp{--prefix} and @samp{--enable-add-ons}. The
|
||||
This defaults to @file{/usr/local}. The @samp{--enable-add-ons} option
|
||||
tells configure to use all the add-on bundles it finds in the source
|
||||
directory. Since important functionality is provided in add-ons, you
|
||||
should always give this option.
|
||||
should always specify this option.
|
||||
|
||||
It may also be useful to set the @var{CC} and @var{CFLAGS} variables in
|
||||
the environment when running @code{configure}. @var{CC} selects the C
|
||||
compiler that will be used, and @var{CFLAGS} sets optimization options
|
||||
for the compiler.
|
||||
|
||||
Here are all the useful options known by @code{configure}:
|
||||
The following list describes all of the available options for @code{configure}:
|
||||
|
||||
@table @samp
|
||||
@item --prefix=@var{directory}
|
||||
@ -91,13 +91,13 @@ Install machine-independent data files in subdirectories of
|
||||
@item --exec-prefix=@var{directory}
|
||||
Install the library and other machine-dependent files in subdirectories
|
||||
of @file{@var{directory}}. The default is to the @samp{--prefix}
|
||||
directory if that option is given, or @file{/usr/local} otherwise.
|
||||
directory if that option is specified, or @file{/usr/local} otherwise.
|
||||
|
||||
@item --with-headers=@var{directory}
|
||||
Look for kernel header files in @var{directory}, not
|
||||
@file{/usr/include}. Glibc needs information from the kernel's private
|
||||
header files. It will normally look in @file{/usr/include} for them,
|
||||
but if you give this option, it will look in @var{DIRECTORY} instead.
|
||||
but if you specify this option, it will look in @var{DIRECTORY} instead.
|
||||
|
||||
This option is primarily of use on a system where the headers in
|
||||
@file{/usr/include} come from an older version of glibc. Conflicts can
|
||||
@ -107,7 +107,7 @@ compile glibc with a newer set of kernel headers than the ones found in
|
||||
@file{/usr/include}.
|
||||
|
||||
@item --enable-add-ons[=@var{list}]
|
||||
Enable add-on packages in your source tree. If this option is given
|
||||
Enable add-on packages in your source tree. If this option is specified
|
||||
with no list, it enables all the add-on packages it finds. If you do
|
||||
not wish to use some add-on package that you have present in your source
|
||||
tree, give this option a list of the add-ons that you @emph{do} want
|
||||
@ -117,10 +117,10 @@ used, like this: @samp{--enable-add-ons=crypt,linuxthreads}
|
||||
Use the binutils (assembler and linker) in @file{@var{directory}}, not
|
||||
the ones the C compiler would default to. You could use this option if
|
||||
the default binutils on your system cannot deal with all the constructs
|
||||
in the GNU C library. (@code{configure} will detect the problem and
|
||||
suppress these constructs, so the library will still be usable, but
|
||||
functionality may be lost---for example, you can not build a shared libc
|
||||
with old binutils.)
|
||||
in the GNU C library. In that case, @code{configure} will detect the problem and
|
||||
suppress these constructs, so that the library will still be usable, but
|
||||
functionality may be lost---for example, you can't build a shared libc
|
||||
with old binutils.
|
||||
|
||||
@item --without-fp
|
||||
Use this option if your computer lacks hardware floating-point support
|
||||
@ -132,7 +132,7 @@ and your operating system does not emulate an FPU.
|
||||
@c days, but we recommend you build them in case you need them.
|
||||
|
||||
@item --disable-shared
|
||||
Don't build shared libraries even if we could. Not all systems support
|
||||
Don't build shared libraries even if it is possible. Not all systems support
|
||||
shared libraries; you need ELF support and (currently) the GNU linker.
|
||||
|
||||
@item --disable-profile
|
||||
@ -148,7 +148,7 @@ you won't be able to trace bugs through the C library.
|
||||
|
||||
@item --disable-versioning
|
||||
Don't compile the shared libraries with symbol version information.
|
||||
Doing this will make the library that's built incompatible with old
|
||||
Doing this will make the resulting library incompatible with old
|
||||
binaries, so it's not recommended.
|
||||
|
||||
@item --enable-static-nss
|
||||
@ -159,22 +159,22 @@ reconfigured to use a different name database.
|
||||
|
||||
@item --build=@var{build-system}
|
||||
@itemx --host=@var{host-system}
|
||||
These options are for cross-compiling. If you give them both and
|
||||
These options are for cross-compiling. If you specify both options and
|
||||
@var{build-system} is different from @var{host-system}, @code{configure}
|
||||
will prepare to cross-compile glibc from @var{build-system} to be used
|
||||
on @var{host-system}. You'll probably need the @samp{--with-headers}
|
||||
option too, and you may have to override @var{configure}'s selection of
|
||||
the compiler and/or binutils.
|
||||
|
||||
If you give just @samp{--host}, configure will prepare for a native
|
||||
compile but use what you say instead of guessing what your system is.
|
||||
If you only specify @samp{--host}, configure will prepare for a native
|
||||
compile but use what you specify instead of guessing what your system is.
|
||||
This is most useful to change the CPU submodel. For example, if
|
||||
configure guesses your machine as @code{i586-pc-linux-gnu} but you want
|
||||
to compile a library for 386es, give @samp{--host=i386-pc-linux-gnu} or
|
||||
just @samp{--host=i386-linux} and add the appropriate compiler flags
|
||||
(@samp{-mcpu=i386} will do the trick) to @var{CFLAGS}.
|
||||
|
||||
If you give just @samp{--build}, configure will get confused.
|
||||
If you specify just @samp{--build}, configure will get confused.
|
||||
@end table
|
||||
|
||||
To build the library and related programs, type @code{make}. This will
|
||||
@ -200,17 +200,18 @@ Instead, edit the generated @file{Makefile} and uncomment the line
|
||||
@noindent
|
||||
You can change the @samp{4} to some other number as appropriate for
|
||||
your system. Instead of changing the @file{Makefile}, you could give
|
||||
this option directly to @code{make} and call it as, e.g.
|
||||
this option directly to @code{make} and call it as, for example,
|
||||
@code{make PARALLELMFLAGS=-j4}. If you're building in the source
|
||||
directory, you've got to use the latter approach since in this case no
|
||||
new @file{Makefile} is generated which you can change.
|
||||
directory, you must use the latter approach since in this case no
|
||||
new @file{Makefile} is generated for you to change.
|
||||
|
||||
To build and run some test programs which exercise some of the library
|
||||
facilities, type @code{make check}. This should complete successfully;
|
||||
if it doesn't, do not use the built library, and report a bug.
|
||||
@xref{Reporting Bugs}, for how to do that. Note that some of the tests
|
||||
assume they are not being run by @code{root}. We recommend you compile
|
||||
and test glibc as an unprivileged user.
|
||||
To build and run test programs which exercise some of the library
|
||||
facilities, type @code{make check}. If it does not complete
|
||||
successfully, do not use the built library, and report a bug after
|
||||
verifying that the problem is not already known. @xref{Reporting Bugs},
|
||||
for instructions on reporting bugs. Note that some of the tests assume
|
||||
they are not being run by @code{root}. We recommend you compile and
|
||||
test glibc as an unprivileged user.
|
||||
|
||||
To format the @cite{GNU C Library Reference Manual} for printing, type
|
||||
@w{@code{make dvi}}. You need a working @TeX{} installation to do this.
|
||||
@ -224,8 +225,8 @@ info}}, but it shouldn't be necessary.
|
||||
|
||||
To install the library and its header files, and the Info files of the
|
||||
manual, type @code{make install}. This will build things if necessary,
|
||||
before installing them. Don't rely on that; compile everything first.
|
||||
If you are installing glibc as your primary C library, we recommend you
|
||||
before installing them. However, you should still compile everything first.
|
||||
If you are installing glibc as your primary C library, we recommend that you
|
||||
shut the system down to single-user mode first, and reboot afterward.
|
||||
This minimizes the risk of breaking things when the library changes out
|
||||
from underneath.
|
||||
@ -233,8 +234,8 @@ from underneath.
|
||||
If you are upgrading from a previous installation of glibc 2.0 or 2.1,
|
||||
@samp{make install} will do the entire job. If you're upgrading from
|
||||
Linux libc5 or some other C library, you need to rename the old
|
||||
@file{/usr/include} directory out of the way before running @samp{make
|
||||
install}, or you will end up with a mixture of header files from both
|
||||
@file{/usr/include} directory before running @samp{make install},
|
||||
or you will end up with a mixture of header files from both
|
||||
libraries, and you won't be able to compile anything. You may also need
|
||||
to reconfigure GCC to work with the new library. The easiest way to do
|
||||
that is to figure out the compiler switches to make it work again
|
||||
@ -279,7 +280,7 @@ build the GNU C library:
|
||||
GNU @code{make} 3.75
|
||||
|
||||
You need the latest version of GNU @code{make}. Modifying the GNU C
|
||||
Library to work with other @code{make} programs would be so hard that we
|
||||
Library to work with other @code{make} programs would be so difficult that we
|
||||
recommend you port GNU @code{make} instead. @strong{Really.} We
|
||||
recommend version GNU @code{make} version 3.75 or 3.77. All earlier
|
||||
versions have severe bugs or lack features. Version 3.76 is known to
|
||||
@ -418,8 +419,8 @@ they definitely don't work anymore. Porting the library is not hard.
|
||||
If you are interested in doing a port, please contact the glibc
|
||||
maintainers by sending electronic mail to @email{bug-glibc@@gnu.org}.
|
||||
|
||||
Each case of @samp{i@var{x}86} can be @samp{i386}, @samp{i486},
|
||||
@samp{i586}, or @samp{i686}. All of those configurations produce a
|
||||
Valid cases of @samp{i@var{x}86} include @samp{i386}, @samp{i486},
|
||||
@samp{i586}, and @samp{i686}. All of those configurations produce a
|
||||
library that can run on this processor and newer processors. The GCC
|
||||
compiler by default generates code that's optimized for the machine it's
|
||||
configured for and will use the instructions available on that machine.
|
||||
@ -436,7 +437,7 @@ switches via @var{CFLAGS}.
|
||||
|
||||
If you are installing GNU libc on a Linux system, you need to have
|
||||
the header files from a 2.2 kernel around for reference. You do not
|
||||
need to use the 2.2 kernel, just have its headers where glibc can get
|
||||
need to use the 2.2 kernel, just have its headers where glibc can access
|
||||
at them. The easiest way to do this is to unpack it in a directory
|
||||
such as @file{/usr/src/linux-2.2.1}. In that directory, run
|
||||
@samp{make config} and accept all the defaults. Then run @samp{make
|
||||
@ -483,8 +484,8 @@ errors and omissions in this manual. If you report them, they will get
|
||||
fixed. If you don't, no one will ever know about them and they will
|
||||
remain unfixed for all eternity, if not longer.
|
||||
|
||||
It is a good idea to check first that the problem was not reported
|
||||
before. Bugs are documented in two places: The file @file{BUGS}
|
||||
It is a good idea to verify that the problem has not already been
|
||||
reported. Bugs are documented in two places: The file @file{BUGS}
|
||||
describes a number of well known bugs and the bug tracking system has a
|
||||
WWW interface at
|
||||
@url{http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl}. The WWW
|
||||
@ -525,5 +526,5 @@ function's behavior disagrees with the manual, then either the library
|
||||
or the manual has a bug, so report the disagreement. If you find any
|
||||
errors or omissions in this manual, please report them to the Internet
|
||||
address @email{bug-glibc-manual@@gnu.org}. If you refer to specific
|
||||
sections when reporting on the manual, please include the section names
|
||||
for easier identification.
|
||||
sections of the manual, please include the section names for easier
|
||||
identification.
|
||||
|
@ -1298,7 +1298,7 @@ process.
|
||||
@comment Unix98
|
||||
@deftypefun pid_t tcgetsid (int @var{fildes})
|
||||
This function is used to obtain the process group ID of the session
|
||||
for which terminal specified by @var{fildes} is the controlling terminal.
|
||||
for which the terminal specified by @var{fildes} is the controlling terminal.
|
||||
If the call is successful the group ID is returned. Otherwise the
|
||||
return value is @code{(pid_t) -1} and the global variable @var{errno}
|
||||
is set to the following value:
|
||||
@ -1308,6 +1308,6 @@ The @var{filedes} argument is not a valid file descriptor.
|
||||
|
||||
@item ENOTTY
|
||||
The calling process does not have a controlling terminal, or the file
|
||||
ins not the controlling terminal.
|
||||
is not the controlling terminal.
|
||||
@end table
|
||||
@end deftypefun
|
||||
|
104
manual/lang.texi
104
manual/lang.texi
@ -51,8 +51,8 @@ without indicating anything might be wrong.
|
||||
@comment assert.h
|
||||
@comment ISO
|
||||
@deftypefn Macro void assert (int @var{expression})
|
||||
Verify the programmer's belief that @var{expression} should be nonzero
|
||||
at this point in the program.
|
||||
Verify the programmer's belief that @var{expression} is nonzero at
|
||||
this point in the program.
|
||||
|
||||
If @code{NDEBUG} is not defined, @code{assert} tests the value of
|
||||
@var{expression}. If it is false (zero), @code{assert} aborts the
|
||||
@ -67,7 +67,7 @@ form:
|
||||
on the standard error stream @code{stderr} (@pxref{Standard Streams}).
|
||||
The filename and line number are taken from the C preprocessor macros
|
||||
@code{__FILE__} and @code{__LINE__} and specify where the call to
|
||||
@code{assert} was written. When using the GNU C compiler, the name of
|
||||
@code{assert} was made. When using the GNU C compiler, the name of
|
||||
the function which calls @code{assert} is taken from the built-in
|
||||
variable @code{__PRETTY_FUNCTION__}; with older compilers, the function
|
||||
name and following colon are omitted.
|
||||
@ -95,7 +95,7 @@ Similar to @code{assert}, but verifies that @var{errnum} is zero.
|
||||
|
||||
If @code{NDEBUG} is defined, @code{assert_perror} tests the value of
|
||||
@var{errnum}. If it is nonzero, @code{assert_perror} aborts the program
|
||||
after a printing a message of the form:
|
||||
after printing a message of the form:
|
||||
|
||||
@smallexample
|
||||
@file{@var{file}}:@var{linenum}: @var{function}: @var{error text}
|
||||
@ -109,7 +109,7 @@ name are as for @code{assert}. The error text is the result of
|
||||
Like @code{assert}, if @code{NDEBUG} is defined before @file{assert.h}
|
||||
is included, the @code{assert_perror} macro does absolutely nothing. It
|
||||
does not evaluate the argument, so @var{errnum} should not have any side
|
||||
effects. It is best for @var{errnum} to be a just simple variable
|
||||
effects. It is best for @var{errnum} to be just a simple variable
|
||||
reference; often it will be @code{errno}.
|
||||
|
||||
This macro is a GNU extension.
|
||||
@ -117,20 +117,17 @@ This macro is a GNU extension.
|
||||
|
||||
@strong{Usage note:} The @code{assert} facility is designed for
|
||||
detecting @emph{internal inconsistency}; it is not suitable for
|
||||
reporting invalid input or improper usage by @emph{the user} of the
|
||||
reporting invalid input or improper usage by the @emph{user} of the
|
||||
program.
|
||||
|
||||
The information in the diagnostic messages printed by the @code{assert}
|
||||
macro is intended to help you, the programmer, track down the cause of a
|
||||
bug, but is not really useful for telling a user of your program why his
|
||||
or her input was invalid or why a command could not be carried out. So
|
||||
you can't use @code{assert} or @code{assert_perror} to print the error
|
||||
messages for these eventualities.
|
||||
|
||||
What's more, your program should not abort when given invalid input, as
|
||||
@code{assert} would do---it should exit with nonzero status (@pxref{Exit
|
||||
Status}) after printing its error messages, or perhaps read another
|
||||
command or move on to the next input file.
|
||||
and @code{assert_perror} macro is intended to help you, the programmer,
|
||||
track down the cause of a bug, but is not really useful for telling a user
|
||||
of your program why his or her input was invalid or why a command could not
|
||||
be carried out. What's more, your program should not abort when given
|
||||
invalid input, as @code{assert} would do---it should exit with nonzero
|
||||
status (@pxref{Exit Status}) after printing its error messages, or perhaps
|
||||
read another command or move on to the next input file.
|
||||
|
||||
@xref{Error Messages}, for information on printing error messages for
|
||||
problems that @emph{do not} represent bugs in the program.
|
||||
@ -256,10 +253,9 @@ func (const char *a, int b, @dots{})
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
outlines a definition of a function @code{func} which returns an
|
||||
@code{int} and takes two required arguments, a @code{const char *} and
|
||||
an @code{int}. These are followed by any number of anonymous
|
||||
arguments.
|
||||
defines a function @code{func} which returns an @code{int} and takes two
|
||||
required arguments, a @code{const char *} and an @code{int}. These are
|
||||
followed by any number of anonymous arguments.
|
||||
|
||||
@strong{Portability note:} For some C compilers, the last required
|
||||
argument must not be declared @code{register} in the function
|
||||
@ -303,10 +299,10 @@ values if you try to access too many arguments.
|
||||
You indicate that you are finished with the argument pointer variable by
|
||||
calling @code{va_end}.
|
||||
|
||||
(In practice, with most C compilers, calling @code{va_end} does nothing
|
||||
and you do not really need to call it. This is always true in the GNU C
|
||||
compiler. But you might as well call @code{va_end} just in case your
|
||||
program is someday compiled with a peculiar compiler.)
|
||||
(In practice, with most C compilers, calling @code{va_end} does nothing.
|
||||
This is always true in the GNU C compiler. But you might as well call
|
||||
@code{va_end} just in case your program is someday compiled with a peculiar
|
||||
compiler.)
|
||||
@end enumerate
|
||||
|
||||
@xref{Argument Macros}, for the full definitions of @code{va_start},
|
||||
@ -317,7 +313,7 @@ optional arguments. However, you can pass the @code{va_list} variable
|
||||
as an argument to another function and perform all or part of step 2
|
||||
there.
|
||||
|
||||
You can perform the entire sequence of the three steps multiple times
|
||||
You can perform the entire sequence of three steps multiple times
|
||||
within a single function invocation. If you want to ignore the optional
|
||||
arguments, you can do these steps zero times.
|
||||
|
||||
@ -342,10 +338,9 @@ regardless.
|
||||
|
||||
There is no general way for a function to determine the number and type
|
||||
of the optional arguments it was called with. So whoever designs the
|
||||
function typically designs a convention for the caller to tell it how
|
||||
many arguments it has, and what kind. It is up to you to define an
|
||||
appropriate calling convention for each variadic function, and write all
|
||||
calls accordingly.
|
||||
function typically designs a convention for the caller to specify the number
|
||||
and type of arguments. It is up to you to define an appropriate calling
|
||||
convention for each variadic function, and write all calls accordingly.
|
||||
|
||||
One kind of calling convention is to pass the number of optional
|
||||
arguments as one of the fixed arguments. This convention works provided
|
||||
@ -375,11 +370,10 @@ in just this way; see @ref{Executing a File}.
|
||||
@cindex calling variadic functions
|
||||
@cindex declaring variadic functions
|
||||
|
||||
You don't have to write anything special when you call a variadic function.
|
||||
Just write the arguments (required arguments, followed by optional ones)
|
||||
inside parentheses, separated by commas, as usual. But you should prepare
|
||||
by declaring the function with a prototype, and you must know how the
|
||||
argument values are converted.
|
||||
You don't have to do anything special to call a variadic function.
|
||||
Just put the arguments (required arguments, followed by optional ones)
|
||||
inside parentheses, separated by commas, as usual. But you must declare
|
||||
the function with a prototype and know how the argument values are converted.
|
||||
|
||||
In principle, functions that are @emph{defined} to be variadic must also
|
||||
be @emph{declared} to be variadic using a function prototype whenever
|
||||
@ -406,7 +400,7 @@ type @code{char} or @w{@code{short int}} (whether signed or not) are
|
||||
promoted to either @code{int} or @w{@code{unsigned int}}, as
|
||||
appropriate; and that objects of type @code{float} are promoted to type
|
||||
@code{double}. So, if the caller passes a @code{char} as an optional
|
||||
argument, it is promoted to an @code{int}, and the function should get
|
||||
argument, it is promoted to an @code{int}, and the function can access
|
||||
it with @code{va_arg (@var{ap}, int)}.
|
||||
|
||||
Conversion of the required arguments is controlled by the function
|
||||
@ -467,16 +461,16 @@ use it except for reasons of portability.
|
||||
|
||||
Sometimes it is necessary to parse the list of parameters more than once
|
||||
or one wants to remember a certain position in the parameter list. To
|
||||
do this one will have to make a copy of the current value of the
|
||||
argument. But @code{va_list} is an opaque type and it is not guaranteed
|
||||
that one can simply assign the value of a variable to another one of
|
||||
type @code{va_list}
|
||||
do this, one will have to make a copy of the current value of the
|
||||
argument. But @code{va_list} is an opaque type and one cannot necessarily
|
||||
assign the value of one variable of type @code{va_list} to another variable
|
||||
of the same type.
|
||||
|
||||
@comment stdarg.h
|
||||
@comment GNU
|
||||
@deftypefn {Macro} void __va_copy (va_list @var{dest}, va_list @var{src})
|
||||
The @code{__va_copy} macro allows copying of objects of type
|
||||
@code{va_list} even if this is no integral type. The argument pointer
|
||||
@code{va_list} even if this is not an integral type. The argument pointer
|
||||
in @var{dest} is initialized to point to the same argument as the
|
||||
pointer in @var{src}.
|
||||
|
||||
@ -484,10 +478,10 @@ This macro is a GNU extension but it will hopefully also be available in
|
||||
the next update of the ISO C standard.
|
||||
@end deftypefn
|
||||
|
||||
If you want to use @code{__va_copy} you should always be prepared that
|
||||
this macro is not available. On architectures where a simple assignment
|
||||
is invalid it hopefully is and so one should always write something like
|
||||
this:
|
||||
If you want to use @code{__va_copy} you should always be prepared for the
|
||||
possibility that this macro will not be available. On architectures where a
|
||||
simple assignment is invalid, hopefully @code{__va_copy} @emph{will} be available,
|
||||
so one should always write something like this:
|
||||
|
||||
@smallexample
|
||||
@{
|
||||
@ -540,7 +534,7 @@ build (va_alist)
|
||||
@{
|
||||
@end smallexample
|
||||
|
||||
Secondly, you must give @code{va_start} just one argument, like this:
|
||||
Secondly, you must give @code{va_start} only one argument, like this:
|
||||
|
||||
@smallexample
|
||||
va_list p;
|
||||
@ -643,7 +637,7 @@ arguments or variables that hold the size of an object.
|
||||
|
||||
In the GNU system @code{size_t} is equivalent to either
|
||||
@w{@code{unsigned int}} or @w{@code{unsigned long int}}. These types
|
||||
have identical properties on the GNU system, and for most purposes, you
|
||||
have identical properties on the GNU system and, for most purposes, you
|
||||
can use them interchangeably. However, they are distinct as data types,
|
||||
which makes a difference in certain contexts.
|
||||
|
||||
@ -938,7 +932,7 @@ follows.
|
||||
@item
|
||||
@cindex mantissa (of floating point number)
|
||||
@cindex significand (of floating point number)
|
||||
The @dfn{mantissa} or @dfn{significand}, an unsigned integer which is a
|
||||
The @dfn{mantissa} or @dfn{significand} is an unsigned integer which is a
|
||||
part of each floating point number.
|
||||
|
||||
@item
|
||||
@ -957,12 +951,12 @@ Again, the GNU library provides no facilities for dealing with such
|
||||
low-level aspects of the representation.
|
||||
@end itemize
|
||||
|
||||
The mantissa of a floating point number actually represents an implicit
|
||||
fraction whose denominator is the base raised to the power of the
|
||||
precision. Since the largest representable mantissa is one less than
|
||||
this denominator, the value of the fraction is always strictly less than
|
||||
@code{1}. The mathematical value of a floating point number is then the
|
||||
product of this fraction, the sign, and the base raised to the exponent.
|
||||
The mantissa of a floating point number represents an implicit fraction
|
||||
whose denominator is the base raised to the power of the precision. Since
|
||||
the largest representable mantissa is one less than this denominator, the
|
||||
value of the fraction is always strictly less than @code{1}. The
|
||||
mathematical value of a floating point number is then the product of this
|
||||
fraction, the sign, and the base raised to the exponent.
|
||||
|
||||
@cindex normalized floating point number
|
||||
We say that the floating point number is @dfn{normalized} if the
|
||||
@ -1054,7 +1048,7 @@ the IEEE single-precision standard.
|
||||
@comment float.h
|
||||
@comment ISO
|
||||
@item FLT_RADIX
|
||||
This is the value of the base, or radix, of exponent representation.
|
||||
This is the value of the base, or radix, of the exponent representation.
|
||||
This is guaranteed to be a constant expression, unlike the other macros
|
||||
described in this section. The value is 2 on all machines we know of
|
||||
except the IBM 360 and derivatives.
|
||||
@ -1208,7 +1202,7 @@ macro's value is the same as the type it describes.
|
||||
@comment ISO
|
||||
@item FLT_EPSILON
|
||||
|
||||
This is the minimum positive floating point number of type @code{float}
|
||||
This is the maximum positive floating point number of type @code{float}
|
||||
such that @code{1.0 + FLT_EPSILON != 1.0} is true. It's supposed to
|
||||
be no greater than @code{1E-5}.
|
||||
|
||||
|
299
manual/llio.texi
299
manual/llio.texi
@ -97,8 +97,8 @@ for this function:
|
||||
|
||||
@table @code
|
||||
@item EACCES
|
||||
The file exists but is not readable/writable as requested by the @var{flags}
|
||||
argument, the file does not exist and the directory is unwritable so
|
||||
The file exists but is not readable/writeable as requested by the @var{flags}
|
||||
argument, the file does not exist and the directory is unwriteable so
|
||||
it cannot be created.
|
||||
|
||||
@item EEXIST
|
||||
@ -142,19 +142,19 @@ or @code{O_CREAT} is set and the file does not already exist.
|
||||
|
||||
@c !!! umask
|
||||
|
||||
If on a 32 bits machine the sources are translated with
|
||||
If on a 32 bit machine the sources are translated with
|
||||
@code{_FILE_OFFSET_BITS == 64} the function @code{open} returns a file
|
||||
descriptor opened in the large file mode which enables the file handling
|
||||
functions to use files up to @math{2^63} bytes in size and offset from
|
||||
@math{-2^63} to @math{2^63}. This happens transparently for the user
|
||||
since all of the lowlevel file handling functions are equally replaced.
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{open} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{open} should be
|
||||
protected using cancelation handlers.
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The @code{open} function is the underlying primitive for the @code{fopen}
|
||||
@ -166,7 +166,7 @@ and @code{freopen} functions, that create streams.
|
||||
@deftypefun int open64 (const char *@var{filename}, int @var{flags}[, mode_t @var{mode}])
|
||||
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
|
||||
the difference is that on 32 bits systems the file is opened in the
|
||||
difference is that on 32 bit systems the file is opened in the
|
||||
large file mode. I.e., file length and file offsets can exceed 31 bits.
|
||||
|
||||
When the sources are translated with @code{_FILE_OFFSET_BITS == 64} this
|
||||
@ -191,7 +191,7 @@ is equivalent to:
|
||||
open (@var{filename}, O_WRONLY | O_CREAT | O_TRUNC, @var{mode})
|
||||
@end smallexample
|
||||
|
||||
If on a 32 bits machine the sources are translated with
|
||||
If on a 32 bit machine the sources are translated with
|
||||
@code{_FILE_OFFSET_BITS == 64} the function @code{creat} returns a file
|
||||
descriptor opened in the large file mode which enables the file handling
|
||||
functions to use files up to @math{2^63} in size and offset from
|
||||
@ -204,7 +204,7 @@ since all of the lowlevel file handling functions are equally replaced.
|
||||
@deftypefn {Obsolete function} int creat64 (const char *@var{filename}, mode_t @var{mode})
|
||||
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
|
||||
the difference is that on 32 bits systems the file is opened in the
|
||||
the difference is that on 32 bit systems the file is opened in the
|
||||
large file mode. I.e., file length and file offsets can exceed 31 bits.
|
||||
|
||||
To use this file descriptor one must not use the normal operations but
|
||||
@ -234,12 +234,12 @@ When all file descriptors associated with a pipe or FIFO have been closed,
|
||||
any unread data is discarded.
|
||||
@end itemize
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{close} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{close} should be
|
||||
protected using cancelation handlers.
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this, calls to @code{close} should be
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The normal return value from @code{close} is @math{0}; a value of @math{-1}
|
||||
@ -270,7 +270,7 @@ on their meaning.
|
||||
Please note that there is @emph{no} separate @code{close64} function.
|
||||
This is not necessary since this function does not determine nor depend
|
||||
on the mode of the file. The kernel which performs the @code{close}
|
||||
operation knows for which mode the descriptor is used and can handle
|
||||
operation knows which mode the descriptor is used for and can handle
|
||||
this situation.
|
||||
@end deftypefun
|
||||
|
||||
@ -302,8 +302,8 @@ but must be a signed type.
|
||||
@deftypefun ssize_t read (int @var{filedes}, void *@var{buffer}, size_t @var{size})
|
||||
The @code{read} function reads up to @var{size} bytes from the file
|
||||
with descriptor @var{filedes}, storing the results in the @var{buffer}.
|
||||
(This is not necessarily a character string and there is no terminating
|
||||
null character added.)
|
||||
(This is not necessarily a character string, and no terminating null
|
||||
character is added.)
|
||||
|
||||
@cindex end-of-file, on a file descriptor
|
||||
The return value is the number of bytes actually read. This might be
|
||||
@ -365,7 +365,7 @@ a hardware error.
|
||||
@code{EIO} also occurs when a background process tries to read from the
|
||||
controlling terminal, and the normal action of stopping the process by
|
||||
sending it a @code{SIGTTIN} signal isn't working. This might happen if
|
||||
signal is being blocked or ignored, or because the process group is
|
||||
the signal is being blocked or ignored, or because the process group is
|
||||
orphaned. @xref{Job Control}, for more information about job control,
|
||||
and @ref{Signal Handling}, for information about signals.
|
||||
@end table
|
||||
@ -373,14 +373,14 @@ and @ref{Signal Handling}, for information about signals.
|
||||
Please note that there is no function named @code{read64}. This is not
|
||||
necessary since this function does not directly modify or handle the
|
||||
possibly wide file offset. Since the kernel handles this state
|
||||
internally the @code{read} function can be used for all cases.
|
||||
internally, the @code{read} function can be used for all cases.
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{read} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{read} should be
|
||||
protected using cancelation handlers.
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this, calls to @code{read} should be
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The @code{read} function is the underlying primitive for all of the
|
||||
@ -391,23 +391,24 @@ functions that read from streams, such as @code{fgetc}.
|
||||
@comment Unix98
|
||||
@deftypefun ssize_t pread (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off_t @var{offset})
|
||||
The @code{pread} function is similar to the @code{read} function. The
|
||||
first three arguments are identical and also the return values and error
|
||||
codes correspond.
|
||||
first three arguments are identical, and the return values and error
|
||||
codes also correspond.
|
||||
|
||||
The difference is the fourth argument and its handling. The data block
|
||||
is not read from the current position of the file descriptor
|
||||
@code{filedes}. Instead the data is read from the file starting at
|
||||
position @var{offset}. The position of the file descriptor itself is
|
||||
not effected by the operation. The value is the same as before the call.
|
||||
not affected by the operation. The value is the same as before the call.
|
||||
|
||||
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
|
||||
@code{pread} function is in fact @code{pread64} and the type
|
||||
@code{off_t} has 64 bits which makes it possible to handle files up to
|
||||
@code{off_t} has 64 bits, which makes it possible to handle files up to
|
||||
@math{2^63} bytes in length.
|
||||
|
||||
The return value of @code{pread} describes the number of bytes read.
|
||||
In the error case it returns @math{-1} like @code{read} does and the
|
||||
error codes are also the same. Only there are a few more error codes:
|
||||
error codes are also the same, with these additions:
|
||||
|
||||
@table @code
|
||||
@item EINVAL
|
||||
The value given for @var{offset} is negative and therefore illegal.
|
||||
@ -426,15 +427,15 @@ version 2.
|
||||
@deftypefun ssize_t pread64 (int @var{filedes}, void *@var{buffer}, size_t @var{size}, off64_t @var{offset})
|
||||
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
|
||||
@code{off_t} which makes it possible on 32 bits machines to address
|
||||
@code{off_t} which makes it possible on 32 bit machines to address
|
||||
files larger than @math{2^31} bytes and up to @math{2^63} bytes. The
|
||||
file descriptor @code{filedes} must be opened using @code{open64} since
|
||||
otherwise the large offsets possible with @code{off64_t} will lead to
|
||||
errors with a descriptor in small file mode.
|
||||
|
||||
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} on a
|
||||
32 bits machine this function is actually available under the name
|
||||
@code{pread} and so transparently replaces the 32 bits interface.
|
||||
32 bit machine this function is actually available under the name
|
||||
@code{pread} and so transparently replaces the 32 bit interface.
|
||||
@end deftypefun
|
||||
|
||||
@cindex writing to a file descriptor
|
||||
@ -470,7 +471,7 @@ In the case of an error, @code{write} returns @math{-1}. The following
|
||||
@item EAGAIN
|
||||
Normally, @code{write} blocks until the write operation is complete.
|
||||
But if the @code{O_NONBLOCK} flag is set for the file (@pxref{Control
|
||||
Operations}), it returns immediately without writing any data, and
|
||||
Operations}), it returns immediately without writing any data and
|
||||
reports this error. An example of a situation that might cause the
|
||||
process to block on output is writing to a terminal device that supports
|
||||
flow control, where output has been suspended by receipt of a STOP
|
||||
@ -498,7 +499,7 @@ The size of the file would become larger than the implementation can support.
|
||||
|
||||
@item EINTR
|
||||
The @code{write} operation was interrupted by a signal while it was
|
||||
blocked waiting for completion. A signal will not necessary cause
|
||||
blocked waiting for completion. A signal will not necessarily cause
|
||||
@code{write} to return @code{EINTR}; it may instead result in a
|
||||
successful @code{write} which writes fewer bytes than requested.
|
||||
@xref{Interrupted Primitives}.
|
||||
@ -531,12 +532,12 @@ necessary since this function does not directly modify or handle the
|
||||
possibly wide file offset. Since the kernel handles this state
|
||||
internally the @code{write} function can be used for all cases.
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{write} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{write} should be
|
||||
protected using cancelation handlers.
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this, calls to @code{write} should be
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The @code{write} function is the underlying primitive for all of the
|
||||
@ -547,29 +548,30 @@ functions that write to streams, such as @code{fputc}.
|
||||
@comment Unix98
|
||||
@deftypefun ssize_t pwrite (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off_t @var{offset})
|
||||
The @code{pwrite} function is similar to the @code{write} function. The
|
||||
first three arguments are identical and also the return values and error
|
||||
codes correspond.
|
||||
first three arguments are identical, and the return values and error codes
|
||||
also correspond.
|
||||
|
||||
The difference is the fourth argument and its handling. The data block
|
||||
is not written to the current position of the file descriptor
|
||||
@code{filedes}. Instead the data is written to the file starting at
|
||||
position @var{offset}. The position of the file descriptor itself is
|
||||
not effected by the operation. The value is the same as before the call.
|
||||
not affected by the operation. The value is the same as before the call.
|
||||
|
||||
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
|
||||
@code{pwrite} function is in fact @code{pwrite64} and the type
|
||||
@code{off_t} has 64 bits which makes it possible to handle files up to
|
||||
@code{off_t} has 64 bits, which makes it possible to handle files up to
|
||||
@math{2^63} bytes in length.
|
||||
|
||||
The return value of @code{pwrite} describes the number of written bytes.
|
||||
In the error case it returns @math{-1} like @code{write} does and the
|
||||
error codes are also the same. Only there are a few more error codes:
|
||||
error codes are also the same, with these additions:
|
||||
|
||||
@table @code
|
||||
@item EINVAL
|
||||
The value given for @var{offset} is negative and therefore illegal.
|
||||
|
||||
@item ESPIPE
|
||||
The file descriptor @var{filedes} is associate with a pipe or a FIFO and
|
||||
The file descriptor @var{filedes} is associated with a pipe or a FIFO and
|
||||
this device does not allow positioning of the file pointer.
|
||||
@end table
|
||||
|
||||
@ -582,15 +584,15 @@ version 2.
|
||||
@deftypefun ssize_t pwrite64 (int @var{filedes}, const void *@var{buffer}, size_t @var{size}, off64_t @var{offset})
|
||||
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
|
||||
@code{off_t} which makes it possible on 32 bits machines to address
|
||||
@code{off_t} which makes it possible on 32 bit machines to address
|
||||
files larger than @math{2^31} bytes and up to @math{2^63} bytes. The
|
||||
file descriptor @code{filedes} must be opened using @code{open64} since
|
||||
otherwise the large offsets possible with @code{off64_t} will lead to
|
||||
errors with a descriptor in small file mode.
|
||||
|
||||
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
|
||||
32 bits machine this function is actually available under the name
|
||||
@code{pwrite} and so transparently replaces the 32 bits interface.
|
||||
32 bit machine this function is actually available under the name
|
||||
@code{pwrite} and so transparently replaces the 32 bit interface.
|
||||
@end deftypefun
|
||||
|
||||
|
||||
@ -616,8 +618,8 @@ The @code{lseek} function is used to change the file position of the
|
||||
file with descriptor @var{filedes}.
|
||||
|
||||
The @var{whence} argument specifies how the @var{offset} should be
|
||||
interpreted in the same way as for the @code{fseek} function, and must be
|
||||
one of the symbolic constants @code{SEEK_SET}, @code{SEEK_CUR}, or
|
||||
interpreted, in the same way as for the @code{fseek} function, and it must
|
||||
be one of the symbolic constants @code{SEEK_SET}, @code{SEEK_CUR}, or
|
||||
@code{SEEK_END}.
|
||||
|
||||
@table @code
|
||||
@ -684,12 +686,12 @@ When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
|
||||
@code{off_t} has 64 bits which makes it possible to handle files up to
|
||||
@math{2^63} bytes in length.
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{lseek} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{lseek} should be
|
||||
protected using cancelation handlers.
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The @code{lseek} function is the underlying primitive for the
|
||||
@ -703,7 +705,7 @@ descriptors.
|
||||
@deftypefun off64_t lseek64 (int @var{filedes}, off64_t @var{offset}, int @var{whence})
|
||||
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
|
||||
@code{off_t} which makes it possible on 32 bits machines to address
|
||||
@code{off_t} which makes it possible on 32 bit machines to address
|
||||
files larger than @math{2^31} bytes and up to @math{2^63} bytes. The
|
||||
file descriptor @code{filedes} must be opened using @code{open64} since
|
||||
otherwise the large offsets possible with @code{off64_t} will lead to
|
||||
@ -711,7 +713,7 @@ errors with a descriptor in small file mode.
|
||||
|
||||
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} on a
|
||||
32 bits machine this function is actually available under the name
|
||||
@code{lseek} and so transparently replaces the 32 bits interface.
|
||||
@code{lseek} and so transparently replaces the 32 bit interface.
|
||||
@end deftypefun
|
||||
|
||||
You can have multiple descriptors for the same file if you open the file
|
||||
@ -775,7 +777,7 @@ is transparently replaced by @code{off64_t}.
|
||||
@comment Unix98
|
||||
@deftp {Data Type} off64_t
|
||||
This type is used similar to @code{off_t}. The difference is that even
|
||||
on 32 bits machines, where the @code{off_t} type would have 32 bits,
|
||||
on 32 bit machines, where the @code{off_t} type would have 32 bits,
|
||||
@code{off64_t} has 64 bits and so is able to address files up to
|
||||
@math{2^63} bytes in length.
|
||||
|
||||
@ -820,7 +822,7 @@ The @var{opentype} argument is interpreted in the same way as for the
|
||||
@code{fopen} function (@pxref{Opening Streams}), except that
|
||||
the @samp{b} option is not permitted; this is because GNU makes no
|
||||
distinction between text and binary files. Also, @code{"w"} and
|
||||
@code{"w+"} do not cause truncation of the file; these have affect only
|
||||
@code{"w+"} do not cause truncation of the file; these have an effect only
|
||||
when opening a file, and in this case the file has already been opened.
|
||||
You must make sure that the @var{opentype} argument matches the actual
|
||||
mode of the open file descriptor.
|
||||
@ -1027,7 +1029,7 @@ Modes}.
|
||||
@cindex scatter-gather
|
||||
|
||||
Some applications may need to read or write data to multiple buffers,
|
||||
which are seperated in memory. Although this can be done easily enough
|
||||
which are separated in memory. Although this can be done easily enough
|
||||
with multiple calls to @code{read} and @code{write}, it is inefficent
|
||||
because there is overhead associated with each kernel call.
|
||||
|
||||
@ -1102,8 +1104,8 @@ On modern operating systems, it is possible to @dfn{mmap} (pronounced
|
||||
``em-map'') a file to a region of memory. When this is done, the file can
|
||||
be accessed just like an array in the program.
|
||||
|
||||
This is more efficent than @code{read} or @code{write}, as only regions
|
||||
of the file a program actually accesses are loaded. Accesses to
|
||||
This is more efficent than @code{read} or @code{write}, as only the regions
|
||||
of the file that a program actually accesses are loaded. Accesses to
|
||||
not-yet-loaded parts of the mmapped region are handled in the same way as
|
||||
swapped out pages.
|
||||
|
||||
@ -1245,9 +1247,9 @@ The file is on a filesystem that doesn't support mapping.
|
||||
@code{munmap} removes any memory maps from (@var{addr}) to (@var{addr} +
|
||||
@var{length}). @var{length} should be the length of the mapping.
|
||||
|
||||
It is safe to un-map multiple mappings in one command, or include unmapped
|
||||
It is safe to unmap multiple mappings in one command, or include unmapped
|
||||
space in the range. It is also possible to unmap only part of an existing
|
||||
mapping, however only entire pages can be removed. If @var{length} is not
|
||||
mapping. However, only entire pages can be removed. If @var{length} is not
|
||||
an even number of pages, it will be rounded up.
|
||||
|
||||
It returns @math{0} for success and @math{-1} for an error.
|
||||
@ -1257,7 +1259,7 @@ One error is possible:
|
||||
@table @code
|
||||
|
||||
@item EINVAL
|
||||
The memory range given was outside the user mmap range, or wasn't page
|
||||
The memory range given was outside the user mmap range or wasn't page
|
||||
aligned.
|
||||
|
||||
@end table
|
||||
@ -1314,8 +1316,7 @@ There is no existing mapping in at least part of the given region.
|
||||
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
|
||||
in the same @code{mmap} statement. A new mapping with the same
|
||||
characteristics will be returned, but a with the length @var{new_length}
|
||||
instead.
|
||||
characteristics will be returned with the length @var{new_length}.
|
||||
|
||||
One option is possible, @code{MREMAP_MAYMOVE}. If it is given in
|
||||
@var{flags}, the system may remove the existing mapping and create a new
|
||||
@ -1324,8 +1325,6 @@ one of the desired length in another location.
|
||||
The address of the resulting mapping is returned, or @math{-1}. Possible
|
||||
error codes include:
|
||||
|
||||
This function is only available on a few systems. Except for performing
|
||||
optional optimizations one should not rely on this function.
|
||||
@table @code
|
||||
|
||||
@item EFAULT
|
||||
@ -1340,7 +1339,7 @@ The region has pages locked, and if extended it would exceed the
|
||||
process's resource limit for locked pages. @xref{Limits on Resources}.
|
||||
|
||||
@item ENOMEM
|
||||
The region is private writable, and insufficent virtual memory is
|
||||
The region is private writeable, and insufficent virtual memory is
|
||||
available to extend it. Also, this error will occur if
|
||||
@code{MREMAP_MAYMOVE} is not given and the extension would collide with
|
||||
another mapped region.
|
||||
@ -1348,6 +1347,9 @@ another mapped region.
|
||||
@end table
|
||||
@end deftypefun
|
||||
|
||||
This function is only available on a few systems. Except for performing
|
||||
optional optimizations one should not rely on this function.
|
||||
|
||||
Not all file descriptors may be mapped. Sockets, pipes, and most devices
|
||||
only allow sequential access and do not fit into the mapping abstraction.
|
||||
In addition, some regular files may not be mmapable, and older kernels may
|
||||
@ -1533,20 +1535,20 @@ input from multiple sockets in @ref{Server Example}.
|
||||
@section Synchronizing I/O operations
|
||||
|
||||
@cindex synchronizing
|
||||
In most modern operation systems the normal I/O operations are not
|
||||
In most modern operating systems the normal I/O operations are not
|
||||
executed synchronously. I.e., even if a @code{write} system call
|
||||
returns this does not mean the data is actually written to the media,
|
||||
e.g., the disk.
|
||||
|
||||
In situations where synchronization points are necessary the user can
|
||||
use special functions which ensure that all operations finished before
|
||||
In situations where synchronization points are necessary,you can use
|
||||
special functions which ensure that all operations finish before
|
||||
they return.
|
||||
|
||||
@comment unistd.h
|
||||
@comment X/Open
|
||||
@deftypefun int sync (void)
|
||||
A call to this function will not return as long as there is data which
|
||||
that is not 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
|
||||
other process in parallel writes data).
|
||||
|
||||
@ -1555,9 +1557,9 @@ A prototype for @code{sync} can be found in @file{unistd.h}.
|
||||
The return value is zero to indicate no error.
|
||||
@end deftypefun
|
||||
|
||||
More often it is wanted that not all data in the system is committed.
|
||||
Programs want to ensure that data written to a given file are all
|
||||
committed and in this situation @code{sync} is overkill.
|
||||
Programs more often want to ensure that data written to a given file is
|
||||
committed, rather than all data in the system. For this, @code{sync} is overkill.
|
||||
|
||||
|
||||
@comment unistd.h
|
||||
@comment POSIX
|
||||
@ -1569,12 +1571,12 @@ finished.
|
||||
|
||||
A prototype for @code{fsync} can be found in @file{unistd.h}.
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{fsync} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{fsync} should be
|
||||
protected using cancelation handlers.
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this, calls to @code{fsync} should be
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The return value of the function is zero if no error occured. Otherwise
|
||||
@ -1599,9 +1601,9 @@ recovering of the file in case of a problem.
|
||||
@comment unistd.h
|
||||
@comment POSIX
|
||||
@deftypefun int fdatasync (int @var{fildes})
|
||||
When a call to the @code{fdatasync} function returns it is made sure
|
||||
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
|
||||
operations the parts guaranteeing data integrity finished.
|
||||
operations, the parts guaranteeing data integrity finished.
|
||||
|
||||
Not all systems implement the @code{fdatasync} operation. On systems
|
||||
missing this functionality @code{fdatasync} is emulated by a call to
|
||||
@ -1627,10 +1629,10 @@ No synchronization is possible since the system does not implement this.
|
||||
@section Perform I/O Operations in Parallel
|
||||
|
||||
The POSIX.1b standard defines a new set of I/O operations which can
|
||||
reduce the time an application spends waiting at I/O significantly. The
|
||||
significantly reduce the time an application spends waiting at I/O. The
|
||||
new functions allow a program to initiate one or more I/O operations and
|
||||
then immediately resume the normal work while the I/O operations are
|
||||
executed in parallel. The functionality is available if the
|
||||
then immediately resume normal work while the I/O operations are
|
||||
executed in parallel. This functionality is available if the
|
||||
@file{unistd.h} file defines the symbol @code{_POSIX_ASYNCHRONOUS_IO}.
|
||||
|
||||
These functions are part of the library with realtime functions named
|
||||
@ -1641,7 +1643,7 @@ userlevel. In the latter case it might be necessary to link applications
|
||||
with the thread library @file{libpthread} in addition to @file{librt}.
|
||||
|
||||
All AIO operations operate on files which were opened previously. There
|
||||
might be arbitrary many operations for one file running. The
|
||||
might be arbitrarily many operations running for one file. The
|
||||
asynchronous I/O operations are controlled using a data structure named
|
||||
@code{struct aiocb} (@dfn{AIO control block}). It is defined in
|
||||
@file{aio.h} as follows.
|
||||
@ -1651,14 +1653,14 @@ asynchronous I/O operations are controlled using a data structure named
|
||||
@deftp {Data Type} {struct aiocb}
|
||||
The POSIX.1b standard mandates that the @code{struct aiocb} structure
|
||||
contains at least the members described in the following table. There
|
||||
might be more elements which are used by the implementation but
|
||||
might be more elements which are used by the implementation, but
|
||||
depending on these elements is not portable and is highly deprecated.
|
||||
|
||||
@table @code
|
||||
@item int aio_fildes
|
||||
This element specifies the file descriptor which is used for the
|
||||
operation. It must be a legal descriptor since otherwise the operation
|
||||
fails for obvious reasons.
|
||||
fails.
|
||||
|
||||
The device on which the file is opened must allow the seek operation.
|
||||
I.e., it is not possible to use any of the AIO operations on devices
|
||||
@ -1696,9 +1698,9 @@ is created which starts executing the function pointed to by
|
||||
|
||||
@item int aio_lio_opcode
|
||||
This element is only used by the @code{lio_listio} and
|
||||
@code{lio_listio64} functions. Since these functions allow to start an
|
||||
arbitrary number of operations at once and since each operation can be
|
||||
input or output (or nothing) the information must be stored in the
|
||||
@code{lio_listio64} functions. Since these functions allow an
|
||||
arbitrary number of operations to start at once, and each operation can be
|
||||
input or output (or nothing), the information must be stored in the
|
||||
control block. The possible values are:
|
||||
|
||||
@vtable @code
|
||||
@ -1720,13 +1722,13 @@ values must not be handled although the whole array is presented to the
|
||||
@end table
|
||||
|
||||
When the sources are compiled using @code{_FILE_OFFSET_BITS == 64} on a
|
||||
32 bits machine this type is in fact @code{struct aiocb64} since the LFS
|
||||
32 bit machine this type is in fact @code{struct aiocb64} since the LFS
|
||||
interface transparently replaces the @code{struct aiocb} definition.
|
||||
@end deftp
|
||||
|
||||
For use with the AIO functions defined in the LFS there is a similar type
|
||||
defined which replaces the types of the appropriate members with larger
|
||||
types but otherwise is equivalent to @code{struct aiocb}. Especially
|
||||
types but otherwise is equivalent to @code{struct aiocb}. Particularly,
|
||||
all member names are the same.
|
||||
|
||||
@comment aio.h
|
||||
@ -1743,7 +1745,7 @@ I.e., it is not possible to use any of the AIO operations on devices
|
||||
like terminals where an @code{lseek} call would lead to an error.
|
||||
|
||||
@item off64_t aio_offset
|
||||
This element specified at which offset in the file the operation (input
|
||||
This element specifies at which offset in the file the operation (input
|
||||
or output) is performed. Since the operation are carried in arbitrary
|
||||
order and more than one operation for one file descriptor can be
|
||||
started, one cannot expect a current read/write position of the file
|
||||
@ -1758,7 +1760,7 @@ This element specifies the length of the buffer pointed to by @code{aio_buf}.
|
||||
|
||||
@item int aio_reqprio
|
||||
If for the platform @code{_POSIX_PRIORITIZED_IO} and
|
||||
@code{_POSIX_PRIORITY_SCHEDULING} is defined the AIO requests are
|
||||
@code{_POSIX_PRIORITY_SCHEDULING} are defined the AIO requests are
|
||||
processed based on the current scheduling priority. The
|
||||
@code{aio_reqprio} element can then be used to lower the priority of the
|
||||
AIO operation.
|
||||
@ -1766,23 +1768,23 @@ AIO operation.
|
||||
@item struct sigevent aio_sigevent
|
||||
This element specifies how the calling process is notified once the
|
||||
operation terminates. If the @code{sigev_notify} element is
|
||||
@code{SIGEV_NONE} no notification is send. If it is @code{SIGEV_SIGNAL}
|
||||
the signal determined by @code{sigev_signo} is send. Otherwise
|
||||
@code{SIGEV_NONE} no notification is sent. If it is @code{SIGEV_SIGNAL}
|
||||
the signal determined by @code{sigev_signo} is sent. Otherwise
|
||||
@code{sigev_notify} must be @code{SIGEV_THREAD} in which case a thread
|
||||
which starts executing the function pointeed to by
|
||||
which starts executing the function pointed to by
|
||||
@code{sigev_notify_function}.
|
||||
|
||||
@item int aio_lio_opcode
|
||||
This element is only used by the @code{lio_listio} and
|
||||
@code{[lio_listio64} functions. Since these functions allow to start an
|
||||
arbitrary number of operations at once and since each operation can be
|
||||
input or output (or nothing) the information must be stored in the
|
||||
@code{[lio_listio64} functions. Since these functions allow an
|
||||
arbitrary number of operations to start at once, and since each operation can be
|
||||
input or output (or nothing), the information must be stored in the
|
||||
control block. See the description of @code{struct aiocb} for a description
|
||||
of the possible values.
|
||||
@end table
|
||||
|
||||
When the sources are compiled using @code{_FILE_OFFSET_BITS == 64} on a
|
||||
32 bits machine this type is available under the name @code{struct
|
||||
32 bit machine this type is available under the name @code{struct
|
||||
aiocb64} since the LFS replaces transparently the old interface.
|
||||
@end deftp
|
||||
|
||||
@ -1790,7 +1792,7 @@ aiocb64} since the LFS replaces transparently the old interface.
|
||||
* Asynchronous Reads/Writes:: Asynchronous Read and Write Operations.
|
||||
* Status of AIO Operations:: Getting the Status of AIO Operations.
|
||||
* Synchronizing AIO Operations:: Getting into a consistent state.
|
||||
* Cancel AIO Operations:: Cancelation of AIO Operations.
|
||||
* Cancel AIO Operations:: Cancellation of AIO Operations.
|
||||
* Configuration of AIO:: How to optimize the AIO implementation.
|
||||
@end menu
|
||||
|
||||
@ -1800,8 +1802,8 @@ aiocb64} since the LFS replaces transparently the old interface.
|
||||
@comment aio.h
|
||||
@comment POSIX.1b
|
||||
@deftypefun int aio_read (struct aiocb *@var{aiocbp})
|
||||
This function initiates an asynchronous read operation. The function
|
||||
call immediately returns after the operation was enqueued or when an
|
||||
This function initiates an asynchronous read operation. It
|
||||
immediately returns after the operation was enqueued or when an
|
||||
error was encountered.
|
||||
|
||||
The first @code{aiocbp->aio_nbytes} bytes of the file for which
|
||||
@ -1816,10 +1818,10 @@ the request is actually enqueued.
|
||||
The calling process is notified about the termination of the read
|
||||
request according to the @code{aiocbp->aio_sigevent} value.
|
||||
|
||||
When @code{aio_read} returns the return value is zero if no error
|
||||
When @code{aio_read} returns, the return value is zero if no error
|
||||
occurred that can be found before the process is enqueued. If such an
|
||||
early error is found the function returns @math{-1} and sets
|
||||
@code{errno} to one of the following values.
|
||||
early error is found, the function returns @math{-1} and sets
|
||||
@code{errno} to one of the following values:
|
||||
|
||||
@table @code
|
||||
@item EAGAIN
|
||||
@ -1829,7 +1831,7 @@ limitations.
|
||||
The @code{aio_read} function is not implemented.
|
||||
@item EBADF
|
||||
The @code{aiocbp->aio_fildes} descriptor is not valid. This condition
|
||||
needs not be recognized before enqueueing the request and so this error
|
||||
need not be recognized before enqueueing the request and so this error
|
||||
might also be signaled asynchronously.
|
||||
@item EINVAL
|
||||
The @code{aiocbp->aio_offset} or @code{aiocbp->aio_reqpiro} value is
|
||||
@ -1837,22 +1839,21 @@ invalid. This condition need not be recognized before enqueueing the
|
||||
request and so this error might also be signaled asynchrously.
|
||||
@end table
|
||||
|
||||
In the case @code{aio_read} returns zero the current status of the
|
||||
request can be queried using @code{aio_error} and @code{aio_return}
|
||||
functions. As long as the value returned by @code{aio_error} is
|
||||
@code{EINPROGRESS} the operation has not yet completed. If
|
||||
@code{aio_error} returns zero the operation successfully terminated,
|
||||
otherwise the value is to be interpreted as an error code. If the
|
||||
function terminated the result of the operation can be get using a call
|
||||
to @code{aio_return}. The returned value is the same as an equivalent
|
||||
call to @code{read} would have returned. Possible error codes returned
|
||||
by @code{aio_error} are:
|
||||
If @code{aio_read} returns zero, the current status of the request
|
||||
can be queried using @code{aio_error} and @code{aio_return} functions.
|
||||
As long as the value returned by @code{aio_error} is @code{EINPROGRESS}
|
||||
the operation has not yet completed. If @code{aio_error} returns zero,
|
||||
the operation successfully terminated, otherwise the value is to be
|
||||
interpreted as an error code. If the function terminated, the result of
|
||||
the operation can be obtained using a call to @code{aio_return}. The
|
||||
returned value is the same as an equivalent call to @code{read} would
|
||||
have returned. Possible error codes returned by @code{aio_error} are:
|
||||
|
||||
@table @code
|
||||
@item EBADF
|
||||
The @code{aiocbp->aio_fildes} descriptor is not valid.
|
||||
@item ECANCELED
|
||||
The operation was canceled before the operation was finished
|
||||
The operation was cancelled before the operation was finished
|
||||
(@pxref{Cancel AIO Operations})
|
||||
@item EINVAL
|
||||
The @code{aiocbp->aio_offset} value is invalid.
|
||||
@ -1867,7 +1868,7 @@ replaces the normal implementation.
|
||||
@comment Unix98
|
||||
@deftypefun int aio_read64 (struct aiocb *@var{aiocbp})
|
||||
This function is similar to the @code{aio_read} function. The only
|
||||
difference is that on @w{32 bits} 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
|
||||
functionality equivalent to @code{lseek64} (@pxref{File Position
|
||||
Primitive}) to position the file descriptor correctly for the reading,
|
||||
@ -1875,7 +1876,7 @@ as opposed to @code{lseek} functionality used in @code{aio_read}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_read} and so transparently
|
||||
replaces the interface for small files on 32 bits machines.
|
||||
replaces the interface for small files on 32 bit machines.
|
||||
@end deftypefun
|
||||
|
||||
To write data asynchronously to a file there exists an equivalent pair
|
||||
@ -1936,7 +1937,7 @@ by @code{aio_error} are:
|
||||
@item EBADF
|
||||
The @code{aiocbp->aio_fildes} descriptor is not valid.
|
||||
@item ECANCELED
|
||||
The operation was canceled before the operation was finished
|
||||
The operation was cancelled before the operation was finished
|
||||
(@pxref{Cancel AIO Operations})
|
||||
@item EINVAL
|
||||
The @code{aiocbp->aio_offset} value is invalid.
|
||||
@ -1951,7 +1952,7 @@ replaces the normal implementation.
|
||||
@comment Unix98
|
||||
@deftypefun int aio_write64 (struct aiocb *@var{aiocbp})
|
||||
This function is similar to the @code{aio_write} function. The only
|
||||
difference is that on @w{32 bits} 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
|
||||
functionality equivalent to @code{lseek64} (@pxref{File Position
|
||||
Primitive}) to position the file descriptor correctly for the writing,
|
||||
@ -1959,7 +1960,7 @@ as opposed to @code{lseek} functionality used in @code{aio_write}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_write} and so transparently
|
||||
replaces the interface for small files on 32 bits machines.
|
||||
replaces the interface for small files on 32 bit machines.
|
||||
@end deftypefun
|
||||
|
||||
Beside these functions with the more or less traditional interface
|
||||
@ -2055,7 +2056,7 @@ transparently replaces the normal implementation.
|
||||
@comment Unix98
|
||||
@deftypefun int lio_listio64 (int @var{mode}, struct aiocb *const @var{list}, int @var{nent}, struct sigevent *@var{sig})
|
||||
This function is similar to the @code{aio_listio} function. The only
|
||||
difference is that only @w{32 bits} machines the file descriptor should
|
||||
difference is that only @w{32 bit} machines the file descriptor should
|
||||
be opened in the large file mode. Internally @code{lio_listio64} uses
|
||||
functionality equivalent to @code{lseek64} (@pxref{File Position
|
||||
Primitive}) to position the file descriptor correctly for the reading or
|
||||
@ -2064,7 +2065,7 @@ writing, as opposed to @code{lseek} functionality used in
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{lio_listio} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@ -2072,12 +2073,12 @@ machines.
|
||||
@subsection Getting the Status of AIO Operations
|
||||
|
||||
As already described in the documentation of the functions in the last
|
||||
section it must be possible to get information about the status of a I/O
|
||||
request. When the operation is performed really asynchronous (as with
|
||||
section, it must be possible to get information about the status of an I/O
|
||||
request. When the operation is performed truly asynchronously (as with
|
||||
@code{aio_read} and @code{aio_write} and with @code{aio_listio} when the
|
||||
mode is @code{LIO_NOWAIT}) one sometimes needs to know whether a
|
||||
specific request already terminated and if yes, what the result was..
|
||||
The following two function allow to get this kind of information.
|
||||
specific request already terminated and if yes, what the result was.
|
||||
The following two functions allow you to get this kind of information.
|
||||
|
||||
@comment aio.h
|
||||
@comment POSIX.1b
|
||||
@ -2109,7 +2110,7 @@ aiocb64}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_error} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@ -2145,7 +2146,7 @@ aiocb64}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_return} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@ -2156,7 +2157,7 @@ When dealing with asynchronous operations it is sometimes necessary to
|
||||
get into a consistent state. This would mean for AIO that one wants to
|
||||
know whether a certain request or a group of request were processed.
|
||||
This could be done by waiting for the notification sent by the system
|
||||
after the operation terminated but this sometimes would mean wasting
|
||||
after the operation terminated, but this sometimes would mean wasting
|
||||
resources (mainly computation time). Instead POSIX.1b defines two
|
||||
functions which will help with most kinds of consistency.
|
||||
|
||||
@ -2171,12 +2172,12 @@ defined.
|
||||
Calling this function forces all I/O operations operating queued at the
|
||||
time of the function call operating on the file descriptor
|
||||
@code{aiocbp->aio_fildes} into the synchronized I/O completion state
|
||||
(@pxref{Synchronizing I/O}). The @code{aio_fsync} function return
|
||||
(@pxref{Synchronizing I/O}). The @code{aio_fsync} function returns
|
||||
immediately but the notification through the method described in
|
||||
@code{aiocbp->aio_sigevent} will happen only after all requests for this
|
||||
file descriptor terminated and the file is synchronized. This also
|
||||
file descriptor have terminated and the file is synchronized. This also
|
||||
means that requests for this very same file descriptor which are queued
|
||||
after the synchronization request are not effected.
|
||||
after the synchronization request are not affected.
|
||||
|
||||
If @var{op} is @code{O_DSYNC} the synchronization happens as with a call
|
||||
to @code{fdatasync}. Otherwise @var{op} should be @code{O_SYNC} and
|
||||
@ -2222,7 +2223,7 @@ aiocb64}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_fsync} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@ -2286,12 +2287,12 @@ aiocb64}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_suspend} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@node Cancel AIO Operations
|
||||
@subsection Cancelation of AIO Operations
|
||||
@subsection Cancellation of AIO Operations
|
||||
|
||||
When one or more requests are asynchronously processed it might be
|
||||
useful in some situations to cancel a selected operation, e.g., if it
|
||||
@ -2300,7 +2301,7 @@ have to be overwritten soon. As an example assume an application, which
|
||||
writes data in files in a situation where new incoming data would have
|
||||
to be written in a file which will be updated by an enqueued request.
|
||||
The POSIX AIO implementation provides such a function but this function
|
||||
is not capable to force the cancelation of the request. It is up to the
|
||||
is not capable to force the cancellation of the request. It is up to the
|
||||
implementation to decide whether it is possible to cancel the operation
|
||||
or not. Therefore using this function is merely a hint.
|
||||
|
||||
@ -2312,26 +2313,26 @@ outstanding requests. If the @var{aiocbp} parameter is @code{NULL} the
|
||||
function tries to cancel all outstanding requests which would process
|
||||
the file descriptor @var{fildes} (i.e.,, whose @code{aio_fildes} member
|
||||
is @var{fildes}). If @var{aiocbp} is not @code{NULL} the very specific
|
||||
request pointed to by @var{aiocbp} is tried to be canceled.
|
||||
request pointed to by @var{aiocbp} is tried to be cancelled.
|
||||
|
||||
For requests which were successfully canceled the normal notification
|
||||
For requests which were successfully cancelled the normal notification
|
||||
about the termination of the request should take place. I.e., depending
|
||||
on the @code{struct sigevent} object which controls this, nothing
|
||||
happens, a signal is sent or a thread is started. If the request cannot
|
||||
be canceled it terminates the usual way after performing te operation.
|
||||
be cancelled it terminates the usual way after performing te operation.
|
||||
|
||||
After a request is successfully canceled a call to @code{aio_error} with
|
||||
After a request is successfully cancelled a call to @code{aio_error} with
|
||||
a reference to this request as the parameter will return
|
||||
@code{ECANCELED} and a call to @code{aio_return} will return @math{-1}.
|
||||
If the request wasn't canceled and is still running the error status is
|
||||
If the request wasn't cancelled and is still running the error status is
|
||||
still @code{EINPROGRESS}.
|
||||
|
||||
The return value of the function is @code{AIO_CANCELED} if there were
|
||||
requests which haven't terminated and which successfully were canceled.
|
||||
If there is one or more request left which couldn't be canceled the
|
||||
requests which haven't terminated and which successfully were cancelled.
|
||||
If there is one or more request left which couldn't be cancelled the
|
||||
return value is @code{AIO_NOTCANCELED}. In this case @code{aio_error}
|
||||
must be used to find out which of the perhaps multiple requests (in
|
||||
@var{aiocbp} is @code{NULL}) wasn't successfully canceled. If all
|
||||
@var{aiocbp} is @code{NULL}) wasn't successfully cancelled. If all
|
||||
requests already terminated at the time @code{aio_cancel} is called the
|
||||
return value is @code{AIO_ALLDONE}.
|
||||
|
||||
@ -2360,7 +2361,7 @@ aiocb64}.
|
||||
|
||||
When the sources are compiled with @code{_FILE_OFFSET_BITS == 64} this
|
||||
function is available under the name @code{aio_cancel} and so
|
||||
transparently replaces the interface for small files on 32 bits
|
||||
transparently replaces the interface for small files on 32 bit
|
||||
machines.
|
||||
@end deftypefun
|
||||
|
||||
@ -2486,12 +2487,12 @@ Set process or process group ID to receive @code{SIGIO} signals.
|
||||
@xref{Interrupt Input}.
|
||||
@end table
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multi-threaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{fcntl} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{fcntl} should be
|
||||
protected using cancelation handlers.
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
@end deftypefun
|
||||
|
||||
|
202
manual/math.texi
202
manual/math.texi
@ -49,7 +49,7 @@ Which of the three versions of a function should be used depends on the
|
||||
situation. For most calculations, the @code{float} functions are the
|
||||
fastest. On the other hand, the @code{long double} functions have the
|
||||
highest precision. @code{double} is somewhere in between. It is
|
||||
usually wise to pick the narrowest type that can accomodate your data.
|
||||
usually wise to pick the narrowest type that can accommodate your data.
|
||||
Not all machines have a distinct @code{long double} type; it may be the
|
||||
same as @code{double}.
|
||||
|
||||
@ -87,7 +87,7 @@ The natural logarithm of @code{2}.
|
||||
@item M_LN10
|
||||
The natural logarithm of @code{10}.
|
||||
@item M_PI
|
||||
Pi, the ratio of a circle's circumrefence to its diameter.
|
||||
Pi, the ratio of a circle's circumference to its diameter.
|
||||
@item M_PI_2
|
||||
Pi divided by two.
|
||||
@item M_PI_4
|
||||
@ -105,7 +105,7 @@ The reciprocal of the square root of two (also the square root of 1/2).
|
||||
@end vtable
|
||||
|
||||
These constants come from the Unix98 standard and were also available in
|
||||
4.4BSD; therefore, they are only defined if @code{_BSD_SOURCE} or
|
||||
4.4BSD; therefore they are only defined if @code{_BSD_SOURCE} or
|
||||
@code{_XOPEN_SOURCE=500}, or a more general feature select macro, is
|
||||
defined. The default set of features includes these constants.
|
||||
@xref{Feature Test Macros}.
|
||||
@ -294,7 +294,7 @@ pole.
|
||||
@cindex inverse trigonometric functions
|
||||
|
||||
These are the usual arc sine, arc cosine and arc tangent functions,
|
||||
which are the inverses of the sine, cosine and tangent functions,
|
||||
which are the inverses of the sine, cosine and tangent functions
|
||||
respectively.
|
||||
|
||||
@comment math.h
|
||||
@ -544,7 +544,7 @@ These functions extract the exponent of @var{x} and return it as a
|
||||
floating-point value. If @code{FLT_RADIX} is two, @code{logb} is equal
|
||||
to @code{floor (log2 (x))}, except it's probably faster.
|
||||
|
||||
If @var{x} is denormalized, @code{logb} returns the exponent @var{x}
|
||||
If @var{x} is de-normalized, @code{logb} returns the exponent @var{x}
|
||||
would have if it were normalized. If @var{x} is infinity (positive or
|
||||
negative), @code{logb} returns @math{@infinity{}}. If @var{x} is zero,
|
||||
@code{logb} returns @math{@infinity{}}. It does not signal.
|
||||
@ -685,7 +685,7 @@ much smaller. See also the function @code{cabs} in @ref{Absolute Value}.
|
||||
@deftypefunx {long double} expm1l (long double @var{x})
|
||||
These functions return a value equivalent to @code{exp (@var{x}) - 1}.
|
||||
They are computed in a way that is accurate even if @var{x} is
|
||||
near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate due
|
||||
near zero---a case where @code{exp (@var{x}) - 1} would be inaccurate owing
|
||||
to subtraction of two numbers that are nearly equal.
|
||||
@end deftypefun
|
||||
|
||||
@ -720,7 +720,7 @@ logarithm functions.
|
||||
@deftypefunx {complex long double} cexpl (complex long double @var{z})
|
||||
These functions return @code{e} (the base of natural
|
||||
logarithms) raised to the power of @var{z}.
|
||||
Mathematically this corresponds to the value
|
||||
Mathematically, this corresponds to the value
|
||||
|
||||
@ifinfo
|
||||
@math{exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))}
|
||||
@ -740,7 +740,7 @@ $$\exp(z) = e^z = e^{{\rm Re}\,z} (\cos ({\rm Im}\,z) + i \sin ({\rm Im}\,z))$$
|
||||
@comment ISO
|
||||
@deftypefunx {complex long double} clogl (complex long double @var{z})
|
||||
These functions return the natural logarithm of @var{z}.
|
||||
Mathematically this corresponds to the value
|
||||
Mathematically, this corresponds to the value
|
||||
|
||||
@ifinfo
|
||||
@math{log (z) = log (cabs (z)) + I * carg (z)}
|
||||
@ -766,7 +766,7 @@ or is very close to 0. It is well-defined for all other values of
|
||||
@comment GNU
|
||||
@deftypefunx {complex long double} clog10l (complex long double @var{z})
|
||||
These functions return the base 10 logarithm of the complex value
|
||||
@var{z}. Mathematically this corresponds to the value
|
||||
@var{z}. Mathematically, this corresponds to the value
|
||||
|
||||
@ifinfo
|
||||
@math{log (z) = log10 (cabs (z)) + I * carg (z)}
|
||||
@ -992,7 +992,7 @@ the real-valued functions, there are no restrictions on the value of
|
||||
@cindex Bessel functions
|
||||
@cindex gamma function
|
||||
|
||||
These are some more exotic mathematical functions, which are sometimes
|
||||
These are some more exotic mathematical functions which are sometimes
|
||||
useful. Currently they only have real-valued versions.
|
||||
|
||||
@comment math.h
|
||||
@ -1052,7 +1052,7 @@ gamma (x) = integral from 0 to @infinity{} of t^(x-1) e^-t dt
|
||||
@vindex signgam
|
||||
The sign of the gamma function is stored in the global variable
|
||||
@var{signgam}, which is declared in @file{math.h}. It is @code{1} if
|
||||
the intermediate result was positive or zero, and, @code{-1} if it was
|
||||
the intermediate result was positive or zero, or @code{-1} if it was
|
||||
negative.
|
||||
|
||||
To compute the real gamma function you can use the @code{tgamma}
|
||||
@ -1062,7 +1062,7 @@ lgam = lgamma(x);
|
||||
gam = signgam*exp(lgam);
|
||||
@end smallexample
|
||||
|
||||
The gamma function has singularities at the nonpositive integers.
|
||||
The gamma function has singularities at the non-positive integers.
|
||||
@code{lgamma} will raise the zero divide exception if evaluated at a
|
||||
singularity.
|
||||
@end deftypefun
|
||||
@ -1078,7 +1078,7 @@ singularity.
|
||||
@deftypefunx {long double} lgammal_r (long double @var{x}, int *@var{signp})
|
||||
@code{lgamma_r} is just like @code{lgamma}, but it stores the sign of
|
||||
the intermediate result in the variable pointed to by @var{signp}
|
||||
instead of in the @var{signgam} global.
|
||||
instead of in the @var{signgam} global. This means it is reentrant.
|
||||
@end deftypefun
|
||||
|
||||
@comment math.h
|
||||
@ -1092,7 +1092,7 @@ instead of in the @var{signgam} global.
|
||||
@deftypefunx {long double} gammal (long double @var{x})
|
||||
These functions exist for compatibility reasons. They are equivalent to
|
||||
@code{lgamma} etc. It is better to use @code{lgamma} since for one the
|
||||
name reflects better the actual computation and @code{lgamma} is also
|
||||
name reflects better the actual computation, moreover @code{lgamma} is
|
||||
standardized in @w{ISO C 9x} while @code{gamma} is not.
|
||||
@end deftypefun
|
||||
|
||||
@ -1225,7 +1225,7 @@ pseudo-random series each time your program runs, you must specify a
|
||||
different seed each time. For ordinary purposes, basing the seed on the
|
||||
current time works well.
|
||||
|
||||
You can get repeatable sequences of numbers on a particular machine type
|
||||
You can obtain repeatable sequences of numbers on a particular machine type
|
||||
by specifying the same initial seed value for the random number
|
||||
generator. There is no standard meaning for a particular seed value;
|
||||
the same seed, used in different C libraries or on different CPU types,
|
||||
@ -1322,10 +1322,10 @@ The prototypes for these functions are in @file{stdlib.h}.
|
||||
This function returns the next pseudo-random number in the sequence.
|
||||
The value returned ranges from @code{0} to @code{RAND_MAX}.
|
||||
|
||||
@strong{Note:} Historically this function returned a @code{long
|
||||
int} value. On 64bit systems @code{long int} would have been larger
|
||||
than programs expected, so @code{random} is now defined to return
|
||||
exactly 32 bits.
|
||||
@strong{Note:} Historically this function returned a @code{long int}
|
||||
value. On 64-bit systems @code{long int} would have been larger than
|
||||
programs expected, so @code{random} is now defined to return exactly 32
|
||||
bits.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@ -1374,10 +1374,10 @@ generator functions. They use a state of 48 bits of data. The user can
|
||||
choose among a collection of functions which return the random bits
|
||||
in different forms.
|
||||
|
||||
Generally there are two kinds of functions: those which use a state of
|
||||
Generally there are two kinds of function. The first uses a state of
|
||||
the random number generator which is shared among several functions and
|
||||
by all threads of the process. The second group of functions require
|
||||
the user to handle the state.
|
||||
by all threads of the process. The second requires the user to handle
|
||||
the state.
|
||||
|
||||
All functions have in common that they use the same congruential
|
||||
formula with the same constants. The formula is
|
||||
@ -1389,7 +1389,7 @@ Y = (a * X + c) mod m
|
||||
@noindent
|
||||
where @var{X} is the state of the generator at the beginning and
|
||||
@var{Y} the state at the end. @code{a} and @code{c} are constants
|
||||
determining the way the generator work. By default they are
|
||||
determining the way the generator works. By default they are
|
||||
|
||||
@smallexample
|
||||
a = 0x5DEECE66D = 25214903917
|
||||
@ -1398,7 +1398,7 @@ c = 0xb = 11
|
||||
|
||||
@noindent
|
||||
but they can also be changed by the user. @code{m} is of course 2^48
|
||||
since the state consists of a 48 bit array.
|
||||
since the state consists of a 48-bit array.
|
||||
|
||||
|
||||
@comment stdlib.h
|
||||
@ -1408,7 +1408,7 @@ This function returns a @code{double} value in the range of @code{0.0}
|
||||
to @code{1.0} (exclusive). The random bits are determined by the global
|
||||
state of the random number generator in the C library.
|
||||
|
||||
Since the @code{double} type according to @w{IEEE 754} has a 52 bit
|
||||
Since the @code{double} type according to @w{IEEE 754} has a 52-bit
|
||||
mantissa this means 4 bits are not initialized by the random number
|
||||
generator. These are (of course) chosen to be the least significant
|
||||
bits and they are initialized to @code{0}.
|
||||
@ -1418,20 +1418,20 @@ bits and they are initialized to @code{0}.
|
||||
@comment SVID
|
||||
@deftypefun double erand48 (unsigned short int @var{xsubi}[3])
|
||||
This function returns a @code{double} value in the range of @code{0.0}
|
||||
to @code{1.0} (exclusive), similar to @code{drand48}. The argument is
|
||||
to @code{1.0} (exclusive), similarly to @code{drand48}. The argument is
|
||||
an array describing the state of the random number generator.
|
||||
|
||||
This function can be called subsequently since it updates the array to
|
||||
guarantee random numbers. The array should have been initialized before
|
||||
using to get reproducible results.
|
||||
initial use to obtain reproducible results.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment SVID
|
||||
@deftypefun {long int} lrand48 (void)
|
||||
The @code{lrand48} functions return an integer value in the range of
|
||||
The @code{lrand48} function returns an integer value in the range of
|
||||
@code{0} to @code{2^31} (exclusive). Even if the size of the @code{long
|
||||
int} type can take more than 32 bits no higher numbers are returned.
|
||||
int} type can take more than 32 bits, no higher numbers are returned.
|
||||
The random bits are determined by the global state of the random number
|
||||
generator in the C library.
|
||||
@end deftypefun
|
||||
@ -1444,10 +1444,10 @@ returns a number in the range of @code{0} to @code{2^31} (exclusive) but
|
||||
the state of the random number generator used to produce the random bits
|
||||
is determined by the array provided as the parameter to the function.
|
||||
|
||||
The numbers in the array are afterwards updated so that subsequent calls
|
||||
to this function yield to different results (as it is expected by a
|
||||
random number generator). The array should have been initialized before
|
||||
the first call to get reproducible results.
|
||||
The numbers in the array are updated afterwards so that subsequent calls
|
||||
to this function yield different results (as is expected of a random
|
||||
number generator). The array should have been initialized before the
|
||||
first call to obtain reproducible results.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@ -1468,33 +1468,33 @@ requirements are necessary.
|
||||
@end deftypefun
|
||||
|
||||
The internal state of the random number generator can be initialized in
|
||||
several ways. The functions differ in the completeness of the
|
||||
several ways. The methods differ in the completeness of the
|
||||
information provided.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment SVID
|
||||
@deftypefun void srand48 (long int @var{seedval}))
|
||||
@deftypefun void srand48 (long int @var{seedval})
|
||||
The @code{srand48} function sets the most significant 32 bits of the
|
||||
state internal state of the random number generator to the least
|
||||
internal state of the random number generator to the least
|
||||
significant 32 bits of the @var{seedval} parameter. The lower 16 bits
|
||||
are initialized to the value @code{0x330E}. Even if the @code{long
|
||||
int} type contains more the 32 bits only the lower 32 bits are used.
|
||||
int} type contains more than 32 bits only the lower 32 bits are used.
|
||||
|
||||
Due to this limitation the initialization of the state using this
|
||||
function of not very useful. But it makes it easy to use a construct
|
||||
Owing to this limitation, initialization of the state of this
|
||||
function is not very useful. But it makes it easy to use a construct
|
||||
like @code{srand48 (time (0))}.
|
||||
|
||||
A side-effect of this function is that the values @code{a} and @code{c}
|
||||
from the internal state, which are used in the congruential formula,
|
||||
are reset to the default values given above. This is of importance once
|
||||
the user called the @code{lcong48} function (see below).
|
||||
the user has called the @code{lcong48} function (see below).
|
||||
@end deftypefun
|
||||
|
||||
@comment stdlib.h
|
||||
@comment SVID
|
||||
@deftypefun {unsigned short int *} seed48 (unsigned short int @var{seed16v}[3])
|
||||
The @code{seed48} function initializes all 48 bits of the state of the
|
||||
internal random number generator from the content of the parameter
|
||||
internal random number generator from the contents of the parameter
|
||||
@var{seed16v}. Here the lower 16 bits of the first element of
|
||||
@var{see16v} initialize the least significant 16 bits of the internal
|
||||
state, the lower 16 bits of @code{@var{seed16v}[1]} initialize the mid-order
|
||||
@ -1507,15 +1507,15 @@ of the state.
|
||||
The value returned by @code{seed48} is a pointer to an array containing
|
||||
the values of the internal state before the change. This might be
|
||||
useful to restart the random number generator at a certain state.
|
||||
Otherwise, the value can simply be ignored.
|
||||
Otherwise the value can simply be ignored.
|
||||
|
||||
As for @code{srand48}, the values @code{a} and @code{c} from the
|
||||
congruential formula are reset to the default values.
|
||||
@end deftypefun
|
||||
|
||||
There is one more function to initialize the random number generator
|
||||
which allows to specify even more information by allowing to change the
|
||||
parameters in the congruential formula.
|
||||
which enables you to specify even more information by allowing you to
|
||||
change the parameters in the congruential formula.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment SVID
|
||||
@ -1527,9 +1527,9 @@ congruential formula.
|
||||
|
||||
From the seven elements in the array @var{param} the least significant
|
||||
16 bits of the entries @code{@var{param}[0]} to @code{@var{param}[2]}
|
||||
determine the initial state, the least 16 bits of
|
||||
determine the initial state, the least significant 16 bits of
|
||||
@code{@var{param}[3]} to @code{@var{param}[5]} determine the 48 bit
|
||||
constant @code{a} and @code{@var{param}[6]} determines the 16 bit value
|
||||
constant @code{a} and @code{@var{param}[6]} determines the 16-bit value
|
||||
@code{c}.
|
||||
@end deftypefun
|
||||
|
||||
@ -1544,22 +1544,21 @@ Please note that it is no problem if several threads use the global
|
||||
state if all threads use the functions which take a pointer to an array
|
||||
containing the state. The random numbers are computed following the
|
||||
same loop but if the state in the array is different all threads will
|
||||
get an individual random number generator.
|
||||
obtain an individual random number generator.
|
||||
|
||||
The user supplied buffer must be of type @code{struct drand48_data}.
|
||||
This type should be regarded as opaque and no member should be used
|
||||
directly.
|
||||
The user-supplied buffer must be of type @code{struct drand48_data}.
|
||||
This type should be regarded as opaque and not manipulated directly.
|
||||
|
||||
@comment stdlib.h
|
||||
@comment GNU
|
||||
@deftypefun int drand48_r (struct drand48_data *@var{buffer}, double *@var{result})
|
||||
This function is equivalent to the @code{drand48} function with the
|
||||
difference it does not modify the global random number generator
|
||||
parameters but instead the parameters is the buffer supplied by the
|
||||
buffer through the pointer @var{buffer}. The random number is return in
|
||||
the variable pointed to by @var{result}.
|
||||
difference that it does not modify the global random number generator
|
||||
parameters but instead the parameters in the buffer supplied through the
|
||||
pointer @var{buffer}. The random number is returned in the variable
|
||||
pointed to by @var{result}.
|
||||
|
||||
The return value of the function indicate whether the call succeeded.
|
||||
The return value of the function indicates whether the call succeeded.
|
||||
If the value is less than @code{0} an error occurred and @var{errno} is
|
||||
set to indicate the problem.
|
||||
|
||||
@ -1570,14 +1569,14 @@ programs.
|
||||
@comment stdlib.h
|
||||
@comment GNU
|
||||
@deftypefun int erand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, double *@var{result})
|
||||
The @code{erand48_r} function works like the @code{erand48} and it takes
|
||||
an argument @var{buffer} which describes the random number generator.
|
||||
The state of the random number generator is taken from the @code{xsubi}
|
||||
array, the parameters for the congruential formula from the global
|
||||
random number generator data. The random number is return in the
|
||||
variable pointed to by @var{result}.
|
||||
The @code{erand48_r} function works like @code{erand48}, but in addition
|
||||
it takes an argument @var{buffer} which describes the random number
|
||||
generator. The state of the random number generator is taken from the
|
||||
@code{xsubi} array, the parameters for the congruential formula from the
|
||||
global random number generator data. The random number is returned in
|
||||
the variable pointed to by @var{result}.
|
||||
|
||||
The return value is non-negative is the call succeeded.
|
||||
The return value is non-negative if the call succeeded.
|
||||
|
||||
This function is a GNU extension and should not be used in portable
|
||||
programs.
|
||||
@ -1586,9 +1585,9 @@ programs.
|
||||
@comment stdlib.h
|
||||
@comment GNU
|
||||
@deftypefun int lrand48_r (struct drand48_data *@var{buffer}, double *@var{result})
|
||||
This function is similar to @code{lrand48} and it takes a pointer to a
|
||||
buffer describing the state of the random number generator as a
|
||||
parameter just like @code{drand48}.
|
||||
This function is similar to @code{lrand48}, but in addition it takes a
|
||||
pointer to a buffer describing the state of the random number generator
|
||||
just like @code{drand48}.
|
||||
|
||||
If the return value of the function is non-negative the variable pointed
|
||||
to by @var{result} contains the result. Otherwise an error occurred.
|
||||
@ -1601,7 +1600,7 @@ programs.
|
||||
@comment GNU
|
||||
@deftypefun int nrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
|
||||
The @code{nrand48_r} function works like @code{nrand48} in that it
|
||||
produces a random number in range @code{0} to @code{2^31}. But instead
|
||||
produces a random number in the range @code{0} to @code{2^31}. But instead
|
||||
of using the global parameters for the congruential formula it uses the
|
||||
information from the buffer pointed to by @var{buffer}. The state is
|
||||
described by the values in @var{xsubi}.
|
||||
@ -1616,8 +1615,8 @@ programs.
|
||||
@comment stdlib.h
|
||||
@comment GNU
|
||||
@deftypefun int mrand48_r (struct drand48_data *@var{buffer}, double *@var{result})
|
||||
This function is similar to @code{mrand48} but as the other reentrant
|
||||
function it uses the random number generator described by the value in
|
||||
This function is similar to @code{mrand48} but like the other reentrant
|
||||
functions it uses the random number generator described by the value in
|
||||
the buffer pointed to by @var{buffer}.
|
||||
|
||||
If the return value is non-negative the variable pointed to by
|
||||
@ -1630,7 +1629,7 @@ programs.
|
||||
@comment stdlib.h
|
||||
@comment GNU
|
||||
@deftypefun int jrand48_r (unsigned short int @var{xsubi}[3], struct drand48_data *@var{buffer}, long int *@var{result})
|
||||
The @code{jrand48_r} function is similar to @code{jrand48}. But as the
|
||||
The @code{jrand48_r} function is similar to @code{jrand48}. Like the
|
||||
other reentrant functions of this function family it uses the
|
||||
congruential formula parameters from the buffer pointed to by
|
||||
@var{buffer}.
|
||||
@ -1642,9 +1641,9 @@ This function is a GNU extension and should not be used in portable
|
||||
programs.
|
||||
@end deftypefun
|
||||
|
||||
Before any of the above functions should be used the buffer of type
|
||||
@code{struct drand48_data} should initialized. The easiest way is to
|
||||
fill the whole buffer with null bytes, e.g., using
|
||||
Before any of the above functions are used the buffer of type
|
||||
@code{struct drand48_data} should be initialized. The easiest way to do
|
||||
this is to fill the whole buffer with null bytes, e.g. by
|
||||
|
||||
@smallexample
|
||||
memset (buffer, '\0', sizeof (struct drand48_data));
|
||||
@ -1655,9 +1654,9 @@ Using any of the reentrant functions of this family now will
|
||||
automatically initialize the random number generator to the default
|
||||
values for the state and the parameters of the congruential formula.
|
||||
|
||||
The other possibility is too use any of the functions which explicitely
|
||||
The other possibility is to use any of the functions which explicitly
|
||||
initialize the buffer. Though it might be obvious how to initialize the
|
||||
buffer from the data given as parameter from the function it is highly
|
||||
buffer from looking at the parameter to the function, it is highly
|
||||
recommended to use these functions since the result might not always be
|
||||
what you expect.
|
||||
|
||||
@ -1665,10 +1664,10 @@ what you expect.
|
||||
@comment GNU
|
||||
@deftypefun int srand48_r (long int @var{seedval}, struct drand48_data *@var{buffer})
|
||||
The description of the random number generator represented by the
|
||||
information in @var{buffer} is initialized similar to what the function
|
||||
information in @var{buffer} is initialized similarly to what the function
|
||||
@code{srand48} does. The state is initialized from the parameter
|
||||
@var{seedval} and the parameters for the congruential formula are
|
||||
initialized to the default values.
|
||||
initialized to their default values.
|
||||
|
||||
If the return value is non-negative the function call succeeded.
|
||||
|
||||
@ -1684,8 +1683,8 @@ initializes all 48 bits of the state from the parameter @var{seed16v}.
|
||||
|
||||
If the return value is non-negative the function call succeeded. It
|
||||
does not return a pointer to the previous state of the random number
|
||||
generator like the @code{seed48} function does. if the user wants to
|
||||
preserve the state for a later rerun s/he can copy the whole buffer
|
||||
generator like the @code{seed48} function does. If the user wants to
|
||||
preserve the state for a later re-run s/he can copy the whole buffer
|
||||
pointed to by @var{buffer}.
|
||||
|
||||
This function is a GNU extension and should not be used in portable
|
||||
@ -1696,11 +1695,11 @@ programs.
|
||||
@comment GNU
|
||||
@deftypefun int lcong48_r (unsigned short int @var{param}[7], struct drand48_data *@var{buffer})
|
||||
This function initializes all aspects of the random number generator
|
||||
described in @var{buffer} by the data in @var{param}. Here it is
|
||||
especially true the function does more than just copying the contents of
|
||||
@var{param} of @var{buffer}. Some more actions are required and
|
||||
therefore it is important to use this function and not initialized the
|
||||
random number generator directly.
|
||||
described in @var{buffer} with the data in @var{param}. Here it is
|
||||
especially true that the function does more than just copying the
|
||||
contents of @var{param} and @var{buffer}. More work is required and
|
||||
therefore it is important to use this function rather than initializing
|
||||
the random number generator directly.
|
||||
|
||||
If the return value is non-negative the function call succeeded.
|
||||
|
||||
@ -1712,23 +1711,22 @@ programs.
|
||||
@section Is Fast Code or Small Code preferred?
|
||||
@cindex Optimization
|
||||
|
||||
If an application uses many floating point function it is often the case
|
||||
that the costs for the function calls itselfs are not neglectable.
|
||||
Modern processor implementation often can execute the operation itself
|
||||
very fast but the call means a disturbance of the control flow.
|
||||
If an application uses many floating point functions it is often the case
|
||||
that the cost of the function calls themselves is not negligible.
|
||||
Modern processors can often execute the operations themselves
|
||||
very fast, but the function call disrupts the instruction pipeline.
|
||||
|
||||
For this reason the GNU C Library provides optimizations for many of the
|
||||
frequently used math functions. When the GNU CC is used and the user
|
||||
activates the optimizer several new inline functions and macros get
|
||||
frequently-used math functions. When GNU CC is used and the user
|
||||
activates the optimizer, several new inline functions and macros are
|
||||
defined. These new functions and macros have the same names as the
|
||||
library function and so get used instead of the later. In case of
|
||||
library functions and so are used instead of the latter. In the case of
|
||||
inline functions the compiler will decide whether it is reasonable to
|
||||
use the inline function and this decision is usually correct.
|
||||
use them, and this decision is usually correct.
|
||||
|
||||
For the generated code this means that no calls to the library functions
|
||||
are necessary. This increases the speed significantly. But the
|
||||
drawback is that the code size increases and this increase is not always
|
||||
neglectable.
|
||||
This means that no calls to the library functions may be necessary, and
|
||||
can increase the speed of generated code significantly. The drawback is
|
||||
that code size will increase, and the increase is not always negligible.
|
||||
|
||||
The speed increase has one drawback: the inline functions might not set
|
||||
@code{errno} and might not have the same precission as the library
|
||||
@ -1736,12 +1734,12 @@ functions.
|
||||
|
||||
In cases where the inline functions and macros are not wanted the symbol
|
||||
@code{__NO_MATH_INLINES} should be defined before any system header is
|
||||
included. This will make sure only library functions are used. Of
|
||||
course it can be determined for each single file in the project whether
|
||||
giving this option is preferred or not.
|
||||
included. This will ensure that only library functions are used. Of
|
||||
course, it can be determined for each file in the project whether
|
||||
giving this option is preferable or not.
|
||||
|
||||
Not all hardware implements the entire @w{IEEE 754} standard, or if it
|
||||
does, there may be a substantial performance penalty for using some of
|
||||
its features. For example, enabling traps on some processors forces
|
||||
the FPU to run unpipelined, which more than doubles calculation time.
|
||||
Not all hardware implements the entire @w{IEEE 754} standard, and even
|
||||
if it does there may be a substantial performance penalty for using some
|
||||
of its features. For example, enabling traps on some processors forces
|
||||
the FPU to run un-pipelined, which can more than double calculation time.
|
||||
@c ***Add explanation of -lieee, -mieee.
|
||||
|
@ -267,7 +267,7 @@ missing.
|
||||
For the @code{hosts} and @code{networks} databases the default value is
|
||||
@code{dns [!UNAVAIL=return] files}. I.e., the system is prepared for
|
||||
the DNS service not to be available but if it is available the answer it
|
||||
returns is ultimative.
|
||||
returns is definitive.
|
||||
|
||||
The @code{passwd}, @code{group}, and @code{shadow} databases are
|
||||
traditionally handled in a special way. The appropriate files in the
|
||||
@ -297,7 +297,7 @@ But one should avoid slow services like this if possible.
|
||||
@node NSS Module Internals, Extending NSS, NSS Configuration File, Name Service Switch
|
||||
@section NSS Module Internals
|
||||
|
||||
Now it is time to described how the modules look like. The functions
|
||||
Now it is time to describe what the modules look like. The functions
|
||||
contained in a module are identified by their names. I.e., there is no
|
||||
jump table or the like. How this is done is of no interest here; those
|
||||
interested in this topic should read about Dynamic Linking.
|
||||
@ -322,8 +322,8 @@ The name of each function consist of various parts:
|
||||
@end quotation
|
||||
|
||||
@var{service} of course corresponds to the name of the module this
|
||||
function is found in.@footnote{Now you might ask why to duplicate this
|
||||
information. The answer is that we want to keep the possibility to link
|
||||
function is found in.@footnote{Now you might ask why this information is
|
||||
duplicated. The answer is that we want to make it possible to link
|
||||
directly with these shared objects.} The @var{function} part is derived
|
||||
from the interface function in the C library itself. If the user calls
|
||||
the function @code{gethostbyname} and the service used is @code{files}
|
||||
@ -364,14 +364,12 @@ Sun's NSS modules are usable as modules which get indirectly loaded
|
||||
only.
|
||||
|
||||
The NSS modules in the GNU C Library are prepared to be used as normal
|
||||
libraries itself.
|
||||
@comment Fix me if necessary.
|
||||
This is @emph{not} true in the moment, though. But the different
|
||||
organization of the name space in the modules does not make it
|
||||
libraries themselves. This is @emph{not} true at the moment, though.
|
||||
However, the organization of the name space in the modules does not make it
|
||||
impossible like it is for Solaris. Now you can see why the modules are
|
||||
still libraries.@footnote{There is a second explanation: we were too
|
||||
lazy to change the Makefiles to allow the generation of shared objects
|
||||
not starting with @file{lib} but do not tell this anybody.}
|
||||
not starting with @file{lib} but don't tell this to anybody.}
|
||||
|
||||
|
||||
@node NSS Modules Interface, , NSS Module Names, NSS Module Internals
|
||||
@ -441,7 +439,7 @@ more.
|
||||
@multitable @columnfractions .3 .2 .50
|
||||
@item
|
||||
@code{NSS_STATUS_TRYAGAIN} @tab
|
||||
@code{EAGAIN} @tab One functions used ran temporarily out of
|
||||
@code{EAGAIN} @tab One of the functions used ran temporarily out of
|
||||
resources or a service is currently not available.
|
||||
@item
|
||||
@tab
|
||||
@ -481,7 +479,7 @@ signature of the module function:
|
||||
@item
|
||||
the return value is @code{int};
|
||||
@item
|
||||
the name is as explain in @pxref{NSS Module Names};
|
||||
the name is as explained in @pxref{NSS Module Names};
|
||||
@item
|
||||
the first arguments are identical to the arguments of the non-reentrant
|
||||
function;
|
||||
@ -561,11 +559,11 @@ more about this command line.
|
||||
|
||||
To use the new module the library must be able to find it. This can be
|
||||
achieved by using options for the dynamic linker so that it will search
|
||||
directory where the binary is placed. For an ELF system this could be
|
||||
the directory where the binary is placed. For an ELF system this could be
|
||||
done by adding the wanted directory to the value of
|
||||
@code{LD_LIBRARY_PATH}.
|
||||
|
||||
But this is not always possible since some program (those which run
|
||||
But this is not always possible since some programs (those which run
|
||||
under IDs which do not belong to the user) ignore this variable.
|
||||
Therefore the stable version of the module should be placed into a
|
||||
directory which is searched by the dynamic linker. Normally this should
|
||||
@ -579,7 +577,7 @@ cause any harm. System administrators should be careful.
|
||||
@subsection Internals of the NSS Module Functions
|
||||
|
||||
Until now we only provided the syntactic interface for the functions in
|
||||
the NSS module. In fact there is not more much we can tell since the
|
||||
the NSS module. In fact there is not much more we can say since the
|
||||
implementation obviously is different for each function. But a few
|
||||
general rules must be followed by all functions.
|
||||
|
||||
@ -635,7 +633,7 @@ As explained above this function could also have an additional last
|
||||
argument. This depends on the database used; it happens only for
|
||||
@code{host} and @code{networks}.
|
||||
|
||||
The function shall return @code{NSS_STATUS_SUCCESS} as long as their are
|
||||
The function shall return @code{NSS_STATUS_SUCCESS} as long as there are
|
||||
more entries. When the last entry was read it should return
|
||||
@code{NSS_STATUS_NOTFOUND}. When the buffer given as an argument is too
|
||||
small for the data to be returned @code{NSS_STATUS_TRYAGAIN} should be
|
||||
|
@ -95,7 +95,7 @@ read by the child process.
|
||||
@cindex filtering i/o through subprocess
|
||||
|
||||
A common use of pipes is to send data to or receive data from a program
|
||||
being run as subprocess. One way of doing this is by using a combination of
|
||||
being run as a subprocess. One way of doing this is by using a combination of
|
||||
@code{pipe} (to create the pipe), @code{fork} (to create the subprocess),
|
||||
@code{dup2} (to force the subprocess to use the pipe as its standard input
|
||||
or output channel), and @code{exec} (to execute the new program). Or,
|
||||
@ -123,7 +123,7 @@ write to the stream to send data to the standard input channel of the
|
||||
subprocess. The subprocess inherits its standard output channel from
|
||||
the parent process.
|
||||
|
||||
In the event of an error, @code{popen} returns a null pointer. This
|
||||
In the event of an error @code{popen} returns a null pointer. This
|
||||
might happen if the pipe or stream cannot be created, if the subprocess
|
||||
cannot be forked, or if the program cannot be executed.
|
||||
@end deftypefun
|
||||
@ -198,7 +198,7 @@ is not greater than @code{PIPE_BUF}. This means that the data transfer
|
||||
seems to be an instantaneous unit, in that nothing else in the system
|
||||
can observe a state in which it is partially complete. Atomic I/O may
|
||||
not begin right away (it may need to wait for buffer space or for data),
|
||||
but once it does begin, it finishes immediately.
|
||||
but once it does begin it finishes immediately.
|
||||
|
||||
Reading or writing a larger amount of data may not be atomic; for
|
||||
example, output data from other processes sharing the descriptor may be
|
||||
|
@ -1659,7 +1659,7 @@ the past.
|
||||
|
||||
Here is an example of a handler for @code{SIGCHLD} that compensates for
|
||||
the fact that the number of signals received may not equal the number of
|
||||
child processes generate them. It assumes that the program keeps track
|
||||
child processes that generate them. It assumes that the program keeps track
|
||||
of all the child processes with a chain of structures as follows:
|
||||
|
||||
@smallexample
|
||||
@ -1809,7 +1809,7 @@ sig_atomic_t last_process_status_change;
|
||||
Handler functions usually don't do very much. The best practice is to
|
||||
write a handler that does nothing but set an external variable that the
|
||||
program checks regularly, and leave all serious work to the program.
|
||||
This is best because the handler can be called at asynchronously, at
|
||||
This is best because the handler can be called asynchronously, at
|
||||
unpredictable times---perhaps in the middle of a primitive function, or
|
||||
even between the beginning and the end of a C operator that requires
|
||||
multiple instructions. The data structures being manipulated might
|
||||
@ -1856,8 +1856,8 @@ blocks signals around each use, then you are safe.
|
||||
|
||||
There are a large number of library functions that return values in a
|
||||
fixed object, always reusing the same object in this fashion, and all of
|
||||
them cause the same problem. The description of a function in this
|
||||
manual always mentions this behavior.
|
||||
them cause the same problem. Function descriptions in this manual
|
||||
always mention this behavior.
|
||||
|
||||
@item
|
||||
If a function uses and modifies an object that you supply, then it is
|
||||
@ -1940,7 +1940,7 @@ Whether the data in your application concerns atoms, or mere text, you
|
||||
have to be careful about the fact that access to a single datum is not
|
||||
necessarily @dfn{atomic}. This means that it can take more than one
|
||||
instruction to read or write a single object. In such cases, a signal
|
||||
handler might in the middle of reading or writing the object.
|
||||
handler might be invoked in the middle of reading or writing the object.
|
||||
|
||||
There are three ways you can cope with this problem. You can use data
|
||||
types that are always accessed atomically; you can carefully arrange
|
||||
@ -2031,9 +2031,9 @@ atomically.
|
||||
|
||||
In practice, you can assume that @code{int} and other integer types no
|
||||
longer than @code{int} are atomic. You can also assume that pointer
|
||||
types are atomic; that is very convenient. Both of these are true on
|
||||
all of the machines that the GNU C library supports, and on all POSIX
|
||||
systems we know of.
|
||||
types are atomic; that is very convenient. Both of these assumptions
|
||||
are true on all of the machines that the GNU C library supports and on
|
||||
all POSIX systems we know of.
|
||||
@c ??? This might fail on a 386 that uses 64-bit pointers.
|
||||
|
||||
@node Atomic Usage
|
||||
@ -2846,7 +2846,7 @@ not only within @code{update_mumble}, but also within the caller. This
|
||||
is also why we do not check @code{signal_pending} if @code{defer_signal}
|
||||
is still nonzero.
|
||||
|
||||
The incrementing and decrementing of @code{defer_signal} require more
|
||||
The incrementing and decrementing of @code{defer_signal} each require more
|
||||
than one instruction; it is possible for a signal to happen in the
|
||||
middle. But that does not cause any problem. If the signal happens
|
||||
early enough to see the value from before the increment or decrement,
|
||||
@ -2932,12 +2932,12 @@ The function was interrupted by delivery of a signal.
|
||||
If the signal causes program termination, @code{pause} doesn't return
|
||||
(obviously).
|
||||
|
||||
This function is a cancelation point in multi-threaded programs. This
|
||||
This function is a cancellation point in multithreaded programs. This
|
||||
is a problem if the thread allocates some resources (like memory, file
|
||||
descriptors, semaphores or whatever) at the time @code{pause} is
|
||||
called. If the thread gets canceled these resources stay allocated
|
||||
called. If the thread gets cancelled these resources stay allocated
|
||||
until the program ends. To avoid this calls to @code{pause} should be
|
||||
protected using cancelation handlers.
|
||||
protected using cancellation handlers.
|
||||
@c ref pthread_cleanup_push / pthread_cleanup_pop
|
||||
|
||||
The @code{pause} function is declared in @file{unistd.h}.
|
||||
|
@ -8,18 +8,17 @@ communication using sockets.
|
||||
@cindex socket
|
||||
@cindex interprocess communication, with sockets
|
||||
A @dfn{socket} is a generalized interprocess communication channel.
|
||||
Like a pipe, a socket is represented as a file descriptor. But,
|
||||
unlike pipes, sockets support communication between unrelated
|
||||
processes, and even between processes running on different machines
|
||||
that communicate over a network. Sockets are the primary means of
|
||||
communicating with other machines; @code{telnet}, @code{rlogin},
|
||||
@code{ftp}, @code{talk}, and the other familiar network programs use
|
||||
sockets.
|
||||
Like a pipe, a socket is represented as a file descriptor. Unlike pipes
|
||||
sockets support communication between unrelated processes, and even
|
||||
between processes running on different machines that communicate over a
|
||||
network. Sockets are the primary means of communicating with other
|
||||
machines; @code{telnet}, @code{rlogin}, @code{ftp}, @code{talk} and the
|
||||
other familiar network programs use sockets.
|
||||
|
||||
Not all operating systems support sockets. In the GNU library, the
|
||||
header file @file{sys/socket.h} exists regardless of the operating
|
||||
system, and the socket functions always exist, but if the system does
|
||||
not really support sockets, these functions always fail.
|
||||
not really support sockets these functions always fail.
|
||||
|
||||
@strong{Incomplete:} We do not currently document the facilities for
|
||||
broadcast messages or for configuring Internet interfaces. The
|
||||
@ -28,7 +27,7 @@ aren't documented either so far.
|
||||
|
||||
@menu
|
||||
* Socket Concepts:: Basic concepts you need to know about.
|
||||
* Communication Styles::Stream communication, datagrams, and other styles.
|
||||
* Communication Styles::Stream communication, datagrams and other styles.
|
||||
* Socket Addresses:: How socket names (``addresses'') work.
|
||||
* Interface Naming:: Identifying specific network interfaces.
|
||||
* Local Namespace:: Details about the local namespace.
|
||||
@ -61,7 +60,7 @@ communication style specifies the answers to questions such as these:
|
||||
@cindex byte stream
|
||||
@cindex stream (sockets)
|
||||
@strong{What are the units of data transmission?} Some communication
|
||||
styles regard the data as a sequence of bytes, with no larger
|
||||
styles regard the data as a sequence of bytes with no larger
|
||||
structure; others group the bytes into records (which are known in
|
||||
this context as @dfn{packets}).
|
||||
|
||||
@ -81,7 +80,7 @@ to retransmit data as needed.
|
||||
@item
|
||||
@strong{Is communication entirely with one partner?} Some
|
||||
communication styles are like a telephone call---you make a
|
||||
@dfn{connection} with one remote socket, and then exchange data
|
||||
@dfn{connection} with one remote socket and then exchange data
|
||||
freely. Other styles are like mailing letters---you specify a
|
||||
destination address for each message you send.
|
||||
@end itemize
|
||||
@ -112,7 +111,7 @@ start with @samp{PF_}.
|
||||
|
||||
The rules of a protocol apply to the data passing between two programs,
|
||||
perhaps on different computers; most of these rules are handled by the
|
||||
operating system, and you need not know about them. What you do need to
|
||||
operating system and you need not know about them. What you do need to
|
||||
know about protocols is this:
|
||||
|
||||
@itemize @bullet
|
||||
@ -127,30 +126,30 @@ example, the TCP protocol fits only the byte stream style of
|
||||
communication and the Internet namespace.
|
||||
|
||||
@item
|
||||
For each combination of style and namespace, there is a @dfn{default
|
||||
protocol} which you can request by specifying 0 as the protocol
|
||||
For each combination of style and namespace there is a @dfn{default
|
||||
protocol}, which you can request by specifying 0 as the protocol
|
||||
number. And that's what you should normally do---use the default.
|
||||
@end itemize
|
||||
|
||||
Throughout the following description at various places
|
||||
variables/parameters to denote sizes are required. And here the trouble
|
||||
starts. In the first implementations the type of these variables was
|
||||
simply @code{int}. This type was on almost all machines of this time 32
|
||||
bits wide and so a de-factor standard required 32 bit variables. This
|
||||
is important since references to variables of this type are passed to
|
||||
the kernel.
|
||||
simply @code{int}. On most machines at that time an @code{int} was 32
|
||||
bits wide, which created a @emph{de facto} standard requiring 32-bit
|
||||
variables. This is important since references to variables of this type
|
||||
are passed to the kernel.
|
||||
|
||||
But then the POSIX people came and unified the interface with the words
|
||||
"all size values are of type @code{size_t}". But on 64 bit machines
|
||||
@code{size_t} is 64 bits wide, and so variable references are not anymore
|
||||
Then the POSIX people came and unified the interface with the words "all
|
||||
size values are of type @code{size_t}". On 64-bit machines
|
||||
@code{size_t} is 64 bits wide, so pointers to variables were no longer
|
||||
possible.
|
||||
|
||||
The Unix98 specification provides a solution by introducing a type
|
||||
@code{socklen_t}. This type is used in all of the cases that POSIX
|
||||
changed to use @code{size_t}. The only requirement of this type is that
|
||||
it be an unsigned type of at least 32 bits. Therefore, implementations
|
||||
which require that references to 32 bit variables be passed can be as
|
||||
happy as implementations which use 64 bit values.
|
||||
which require that references to 32-bit variables be passed can be as
|
||||
happy as implementations which use 64-bit values.
|
||||
|
||||
|
||||
@node Communication Styles
|
||||
@ -165,8 +164,8 @@ defined in @file{sys/socket.h}.
|
||||
@comment sys/socket.h
|
||||
@comment BSD
|
||||
@deftypevr Macro int SOCK_STREAM
|
||||
The @code{SOCK_STREAM} style is like a pipe (@pxref{Pipes and FIFOs});
|
||||
it operates over a connection with a particular remote socket, and
|
||||
The @code{SOCK_STREAM} style is like a pipe (@pxref{Pipes and FIFOs}).
|
||||
It operates over a connection with a particular remote socket and
|
||||
transmits data reliably as a stream of bytes.
|
||||
|
||||
Use of this style is covered in detail in @ref{Connections}.
|
||||
@ -176,7 +175,7 @@ Use of this style is covered in detail in @ref{Connections}.
|
||||
@comment BSD
|
||||
@deftypevr Macro int SOCK_DGRAM
|
||||
The @code{SOCK_DGRAM} style is used for sending
|
||||
individually-addressed packets, unreliably.
|
||||
individually-addressed packets unreliably.
|
||||
It is the diametrical opposite of @code{SOCK_STREAM}.
|
||||
|
||||
Each time you write data to a socket of this kind, that data becomes
|
||||
@ -190,7 +189,7 @@ fourth and fifth packets; the seventh packet may arrive before the
|
||||
sixth, and may arrive a second time after the sixth.
|
||||
|
||||
The typical use for @code{SOCK_DGRAM} is in situations where it is
|
||||
acceptable to simply resend a packet if no response is seen in a
|
||||
acceptable to simply re-send a packet if no response is seen in a
|
||||
reasonable amount of time.
|
||||
|
||||
@xref{Datagrams}, for detailed information about how to use datagram
|
||||
@ -203,7 +202,7 @@ sockets.
|
||||
@comment sys/socket.h
|
||||
@comment BSD
|
||||
@deftypevr Macro int SOCK_SEQPACKET
|
||||
This style is like @code{SOCK_STREAM} except that the data is
|
||||
This style is like @code{SOCK_STREAM} except that the data are
|
||||
structured into packets.
|
||||
|
||||
A program that receives data over a @code{SOCK_SEQPACKET} socket
|
||||
@ -262,7 +261,7 @@ you send data from a socket, or use it to initiate a connection, the
|
||||
system assigns an address automatically if you have not specified one.
|
||||
|
||||
Occasionally a client needs to specify an address because the server
|
||||
discriminates based on addresses; for example, the rsh and rlogin
|
||||
discriminates based on address; for example, the rsh and rlogin
|
||||
protocols look at the client's socket address and only bypass password
|
||||
checking if it is less than @code{IPPORT_RESERVED} (@pxref{Ports}).
|
||||
|
||||
@ -293,12 +292,12 @@ address. You can't use this data type effectively to interpret an
|
||||
address or construct one; for that, you must use the proper data type
|
||||
for the socket's namespace.
|
||||
|
||||
Thus, the usual practice is to construct an address in the proper
|
||||
Thus, the usual practice is to construct an address of the proper
|
||||
namespace-specific type, then cast a pointer to @code{struct sockaddr *}
|
||||
when you call @code{bind} or @code{getsockname}.
|
||||
|
||||
The one piece of information that you can get from the @code{struct
|
||||
sockaddr} data type is the @dfn{address format} designator which tells
|
||||
sockaddr} data type is the @dfn{address format designator}. This tells
|
||||
you which data type to use to understand the address fully.
|
||||
|
||||
@pindex sys/socket.h
|
||||
@ -376,8 +375,8 @@ for completeness, but there is no reason to use it in a program.
|
||||
@end table
|
||||
|
||||
@file{sys/socket.h} defines symbols starting with @samp{AF_} for many
|
||||
different kinds of networks, all or most of which are not actually
|
||||
implemented. We will document those that really work, as we receive
|
||||
different kinds of networks, most or all of which are not actually
|
||||
implemented. We will document those that really work as we receive
|
||||
information about how to use them.
|
||||
|
||||
@node Setting Address
|
||||
@ -395,7 +394,7 @@ The @code{bind} function assigns an address to the socket
|
||||
@var{socket}. The @var{addr} and @var{length} arguments specify the
|
||||
address; the detailed format of the address depends on the namespace.
|
||||
The first part of the address is always the format designator, which
|
||||
specifies a namespace, and says that the address is in the format for
|
||||
specifies a namespace, and says that the address is in the format of
|
||||
that namespace.
|
||||
|
||||
The return value is @code{0} on success and @code{-1} on failure. The
|
||||
@ -566,15 +565,15 @@ as file names.
|
||||
@node Local Namespace Concepts
|
||||
@subsection Local Namespace Concepts
|
||||
|
||||
In the local namespace, socket addresses are file names. You can specify
|
||||
In the local namespace socket addresses are file names. You can specify
|
||||
any file name you want as the address of the socket, but you must have
|
||||
write permission on the directory containing it. In order to connect to
|
||||
a socket, you must have read permission for it. It's common to put
|
||||
a socket you must have read permission for it. It's common to put
|
||||
these files in the @file{/tmp} directory.
|
||||
|
||||
One peculiarity of the local namespace is that the name is only used when
|
||||
opening the connection; once that is over with, the address is not
|
||||
meaningful and may not exist.
|
||||
One peculiarity of the local namespace is that the name is only used
|
||||
when opening the connection; once open the address is not meaningful and
|
||||
may not exist.
|
||||
|
||||
Another peculiarity is that you cannot connect to such a socket from
|
||||
another machine--not even if the other machine shares the file system
|
||||
@ -582,7 +581,7 @@ which contains the name of the socket. You can see the socket in a
|
||||
directory listing, but connecting to it never succeeds. Some programs
|
||||
take advantage of this, such as by asking the client to send its own
|
||||
process ID, and using the process IDs to distinguish between clients.
|
||||
However, we recommend you not to use this method in protocols you design,
|
||||
However, we recommend you not use this method in protocols you design,
|
||||
as we might someday permit connections from other machines that mount
|
||||
the same file systems. Instead, send each new client an identifying
|
||||
number if you want it to have one.
|
||||
@ -642,7 +641,7 @@ namespace. @xref{Socket Addresses}.
|
||||
This is the file name to use.
|
||||
|
||||
@strong{Incomplete:} Why is 108 a magic number? RMS suggests making
|
||||
this a zero-length array and tweaking the example following to use
|
||||
this a zero-length array and tweaking the following example to use
|
||||
@code{alloca} to allocate an appropriate amount of storage based on
|
||||
the length of the filename.
|
||||
@end table
|
||||
@ -676,15 +675,15 @@ namespace.
|
||||
This section describes the details of the protocols and socket naming
|
||||
conventions used in the Internet namespace.
|
||||
|
||||
Originaly the Internet namespace used only IP version 4 (IPv4). With
|
||||
Originally the Internet namespace used only IP version 4 (IPv4). With
|
||||
the growing number of hosts on the Internet, a new protocol with a
|
||||
larger address space was neccessary: IP version 6 (IPv6). IPv6
|
||||
introduces besides 128bit addresses (IPv4 has 32bit addresses) also
|
||||
other features and will eventually replace IPv4.
|
||||
larger address space was necessary: IP version 6 (IPv6). IPv6
|
||||
introduces 128-bit addresses (IPv4 has 32-bit addresses) and other
|
||||
features, and will eventually replace IPv4.
|
||||
|
||||
To create a socket in the IPv4 Internet namespace, use the symbolic name
|
||||
@code{PF_INET} of this namespace as the @var{namespace} argument to
|
||||
@code{socket} or @code{socketpair}. For IPv6 addresses, you need the
|
||||
@code{socket} or @code{socketpair}. For IPv6 addresses you need the
|
||||
macro @code{PF_INET6}. These macros are defined in @file{sys/socket.h}.
|
||||
@pindex sys/socket.h
|
||||
|
||||
@ -695,7 +694,9 @@ This designates the IPv4 Internet namespace and associated family of
|
||||
protocols.
|
||||
@end deftypevr
|
||||
|
||||
@deftypevr Macro int AF_INET6
|
||||
@comment sys/socket.h
|
||||
@comment X/Open
|
||||
@deftypevr Macro int PF_INET6
|
||||
This designates the IPv6 Internet namespace and associated family of
|
||||
protocols.
|
||||
@end deftypevr
|
||||
@ -706,7 +707,7 @@ A socket address for the Internet namespace includes the following components:
|
||||
@item
|
||||
The address of the machine you want to connect to. Internet addresses
|
||||
can be specified in several ways; these are discussed in @ref{Internet
|
||||
Address Formats}, @ref{Host Addresses}, and @ref{Host Names}.
|
||||
Address Formats}, @ref{Host Addresses} and @ref{Host Names}.
|
||||
|
||||
@item
|
||||
A port number for that machine. @xref{Ports}.
|
||||
@ -719,7 +720,7 @@ for information about this.
|
||||
@menu
|
||||
* Internet Address Formats:: How socket addresses are specified in the
|
||||
Internet namespace.
|
||||
* Host Addresses:: All about host addresses of internet host.
|
||||
* Host Addresses:: All about host addresses of Internet host.
|
||||
* Protocols Database:: Referring to protocols by name.
|
||||
* Ports:: Internet port numbers.
|
||||
* Services Database:: Ports may have symbolic names.
|
||||
@ -751,7 +752,7 @@ Internet namespace. It has the following members:
|
||||
@table @code
|
||||
@item sa_family_t sin_family
|
||||
This identifies the address family or format of the socket address.
|
||||
You should store the value of @code{AF_INET} in this member.
|
||||
You should store the value @code{AF_INET} in this member.
|
||||
@xref{Socket Addresses}.
|
||||
|
||||
@item struct in_addr sin_addr
|
||||
@ -806,9 +807,9 @@ Each computer also has one or more @dfn{host names}, which are strings
|
||||
of words separated by periods, as in @samp{mescaline.gnu.org}.
|
||||
|
||||
Programs that let the user specify a host typically accept both numeric
|
||||
addresses and host names. But the program needs a numeric address to
|
||||
open a connection; to use a host name, you must convert it to the
|
||||
numeric address it stands for.
|
||||
addresses and host names. To open a connection a program needs a
|
||||
numeric address, and so must convert a host name to the numeric address
|
||||
it stands for.
|
||||
|
||||
@menu
|
||||
* Abstract Host Addresses:: What a host number consists of.
|
||||
@ -832,17 +833,17 @@ numbers which identify that computer among all those on the Internet.
|
||||
An IPv4 Internet host address is a number containing four bytes of data.
|
||||
Historically these are divided into two parts, a @dfn{network number} and a
|
||||
@dfn{local network address number} within that network. In the
|
||||
mid-1990s classless address were introduced which changed the
|
||||
mid-1990s classless addresses were introduced which changed this
|
||||
behaviour. Since some functions implicitly expect the old definitions,
|
||||
we first describe the class based network and will then describe
|
||||
classless addresses. IPv6 uses only classless adresses and therefore
|
||||
we first describe the class-based network and will then describe
|
||||
classless addresses. IPv6 uses only classless addresses and therefore
|
||||
the following paragraphs don't apply.
|
||||
|
||||
The class based IPv4 network number consists of the first one, two or
|
||||
The class-based IPv4 network number consists of the first one, two or
|
||||
three bytes; the rest of the bytes are the local address.
|
||||
|
||||
IPv4 network numbers are registered with the Network Information Center
|
||||
(NIC), and are divided into three classes---A, B, and C. The local
|
||||
(NIC), and are divided into three classes---A, B and C. The local
|
||||
network address numbers of individual machines are registered with the
|
||||
administrator of the particular network.
|
||||
|
||||
@ -852,12 +853,12 @@ very large number of hosts. Medium-sized Class B networks have two-byte
|
||||
network numbers, with the first byte in the range 128 to 191. Class C
|
||||
networks are the smallest; they have three-byte network numbers, with
|
||||
the first byte in the range 192-255. Thus, the first 1, 2, or 3 bytes
|
||||
of an Internet address specifies a network. The remaining bytes of the
|
||||
of an Internet address specify a network. The remaining bytes of the
|
||||
Internet address specify the address within that network.
|
||||
|
||||
The Class A network 0 is reserved for broadcast to all networks. In
|
||||
addition, the host number 0 within each network is reserved for broadcast
|
||||
to all hosts in that network. These uses are obsolete now but out of
|
||||
to all hosts in that network. These uses are obsolete now but for
|
||||
compatibility reasons you shouldn't use network 0 and host number 0.
|
||||
|
||||
The Class A network 127 is reserved for loopback; you can always use
|
||||
@ -902,15 +903,15 @@ radix is assumed.
|
||||
|
||||
@subsubheading Classless Addresses
|
||||
|
||||
IPv4 addresses (and IPv6 addresses also) are now considered as
|
||||
classless. The distinction between classes A, B, and C can be ignored.
|
||||
Instead a IPv4 host adddress consists of a 32-bit address and a 32-bit
|
||||
mask. The mask contains bits of 1 for the network part and bits of 0
|
||||
for the host part. The 1-bits are contigous from the leftmost bit, the
|
||||
0-bits are contigous from the rightmost bit so that the netmask can also
|
||||
be written as a prefix length of bits of 1. Classes A, B and C are just
|
||||
special cases of this general rule. For example, class A addresses have
|
||||
a netmask of @samp{255.0.0.0} or a prefix length of 8.
|
||||
IPv4 addresses (and IPv6 addresses also) are now considered classless;
|
||||
the distinction between classes A, B and C can be ignored. Instead an
|
||||
IPv4 host address consists of a 32-bit address and a 32-bit mask. The
|
||||
mask contains set bits for the network part and cleared bits for the
|
||||
host part. The network part is contiguous from the left, with the
|
||||
remaining bits representing the host. As a consequence, the netmask can
|
||||
simply be specified as the number of set bits. Classes A, B and C are
|
||||
just special cases of this general rule. For example, class A addresses
|
||||
have a netmask of @samp{255.0.0.0} or a prefix length of 8.
|
||||
|
||||
Classless IPv4 network addresses are written in numbers-and-dots
|
||||
notation with the prefix length appended and a slash as separator. For
|
||||
@ -921,8 +922,8 @@ example the class A network 10 is written as @samp{10.0.0.0/8}.
|
||||
IPv6 addresses contain 128 bits (IPv4 has 32 bits) of data. A host
|
||||
address is usually written as eight 16-bit hexadecimal numbers that are
|
||||
separated by colons. Two colons are used to abbreviate strings of
|
||||
consecutive zeros. For example the IPv6 loopback address which is
|
||||
@samp{0:0:0:0:0:0:0:1} can be just written as @samp{::1}.
|
||||
consecutive zeros. For example, the IPv6 loopback address
|
||||
@samp{0:0:0:0:0:0:0:1} can just be written as @samp{::1}.
|
||||
|
||||
@node Host Address Data Type
|
||||
@subsubsection Host Address Data Type
|
||||
@ -935,8 +936,8 @@ the integer from the structure or put the integer into a structure.
|
||||
|
||||
You will find older code that uses @code{unsigned long int} for
|
||||
IPv4 Internet host addresses instead of @code{uint32_t} or @code{struct
|
||||
in_addr}. Historically @code{unsigned long int} was a 32 bit number but
|
||||
with 64 bit machines this has changed. Using @code{unsigned long int}
|
||||
in_addr}. Historically @code{unsigned long int} was a 32-bit number but
|
||||
with 64-bit machines this has changed. Using @code{unsigned long int}
|
||||
might break the code if it is used on machines where this type doesn't
|
||||
have 32 bits. @code{uint32_t} is specified by Unix98 and guaranteed to have
|
||||
32 bits.
|
||||
@ -971,7 +972,7 @@ talking to itself.
|
||||
@comment netinet/in.h
|
||||
@comment BSD
|
||||
@deftypevr Macro {uint32_t} INADDR_ANY
|
||||
You can use this constant to stand for ``any incoming address,'' when
|
||||
You can use this constant to stand for ``any incoming address'' when
|
||||
binding to an address. @xref{Setting Address}. This is the usual
|
||||
address to give in the @code{sin_addr} member of @w{@code{struct
|
||||
sockaddr_in}} when you want to accept Internet connections.
|
||||
@ -1002,7 +1003,7 @@ data, which can be accessed (via a union) in a variety of ways.
|
||||
@deftypevr Constant {struct in6_addr} in6addr_loopback
|
||||
This constant is the IPv6 address @samp{::1}, the loopback address. See
|
||||
above for a description of what this means. The macro
|
||||
@code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialise your
|
||||
@code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialize your
|
||||
own variables to this value.
|
||||
@end deftypevr
|
||||
|
||||
@ -1011,7 +1012,7 @@ own variables to this value.
|
||||
@deftypevr Constant {struct in6_addr} in6addr_any
|
||||
This constant is the IPv6 address @samp{::}, the unspecified address. See
|
||||
above for a description of what this means. The macro
|
||||
@code{IN6ADDR_ANY_INIT} is provided to allow you to initialise your
|
||||
@code{IN6ADDR_ANY_INIT} is provided to allow you to initialize your
|
||||
own variables to this value.
|
||||
@end deftypevr
|
||||
|
||||
@ -1022,7 +1023,7 @@ own variables to this value.
|
||||
@noindent
|
||||
These additional functions for manipulating Internet addresses are
|
||||
declared in the header file @file{arpa/inet.h}. They represent Internet
|
||||
addresses in network byte order; they represent network numbers and
|
||||
addresses in network byte order, and network numbers and
|
||||
local-address-within-network numbers in host byte order. @xref{Byte
|
||||
Order}, for an explanation of network and host byte order.
|
||||
|
||||
@ -1041,7 +1042,7 @@ it in the @code{struct in_addr} that @var{addr} points to.
|
||||
This function converts the IPv4 Internet host address @var{name} from the
|
||||
standard numbers-and-dots notation into binary data. If the input is
|
||||
not valid, @code{inet_addr} returns @code{INADDR_NONE}. This is an
|
||||
obsolete interface to @code{inet_aton}, described immediately above; it
|
||||
obsolete interface to @code{inet_aton}, described immediately above. It
|
||||
is obsolete because @code{INADDR_NONE} is a valid address
|
||||
(255.255.255.255), and @code{inet_aton} provides a cleaner way to
|
||||
indicate error return.
|
||||
@ -1170,7 +1171,7 @@ vector of strings.
|
||||
This is the host address type; in practice, its value is always either
|
||||
@code{AF_INET} or @code{AF_INET6}, with the latter being used for IPv6
|
||||
hosts. In principle other kinds of addresses could be represented in
|
||||
the data base as well as Internet addresses; if this were done, you
|
||||
the database as well as Internet addresses; if this were done, you
|
||||
might find a value in this field other than @code{AF_INET} or
|
||||
@code{AF_INET6}. @xref{Socket Addresses}.
|
||||
|
||||
@ -1214,7 +1215,7 @@ named @var{name}. If the lookup fails, it returns a null pointer.
|
||||
@deftypefun {struct hostent *} gethostbyname2 (const char *@var{name}, int @var{af})
|
||||
The @code{gethostbyname2} function is like @code{gethostbyname}, but
|
||||
allows the caller to specify the desired address family (e.g.@:
|
||||
@code{AF_INET} or @code{AF_INET6}) for the result.
|
||||
@code{AF_INET} or @code{AF_INET6}) of the result.
|
||||
@end deftypefun
|
||||
|
||||
@comment netdb.h
|
||||
@ -1245,7 +1246,7 @@ Here are the error codes that you may find in @code{h_errno}:
|
||||
@comment BSD
|
||||
@item HOST_NOT_FOUND
|
||||
@vindex HOST_NOT_FOUND
|
||||
No such host is known in the data base.
|
||||
No such host is known in the database.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@ -1349,8 +1350,8 @@ too small.
|
||||
@end deftypefun
|
||||
|
||||
You can also scan the entire hosts database one entry at a time using
|
||||
@code{sethostent}, @code{gethostent}, and @code{endhostent}. Be careful
|
||||
in using these functions, because they are not reentrant.
|
||||
@code{sethostent}, @code{gethostent} and @code{endhostent}. Be careful
|
||||
when using these functions because they are not reentrant.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@ -1494,8 +1495,8 @@ find such a service, it returns a null pointer.
|
||||
|
||||
@noindent
|
||||
You can also scan the services database using @code{setservent},
|
||||
@code{getservent}, and @code{endservent}. Be careful in using these
|
||||
functions, because they are not reentrant.
|
||||
@code{getservent} and @code{endservent}. Be careful when using these
|
||||
functions because they are not reentrant.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@ -1538,11 +1539,11 @@ order), and others put it last (``little-endian'' order).
|
||||
So that machines with different byte order conventions can
|
||||
communicate, the Internet protocols specify a canonical byte order
|
||||
convention for data transmitted over the network. This is known
|
||||
as the @dfn{network byte order}.
|
||||
as @dfn{network byte order}.
|
||||
|
||||
When establishing an Internet socket connection, you must make sure that
|
||||
the data in the @code{sin_port} and @code{sin_addr} members of the
|
||||
@code{sockaddr_in} structure are represented in the network byte order.
|
||||
@code{sockaddr_in} structure are represented in network byte order.
|
||||
If you are encoding integer data in the messages sent through the
|
||||
socket, you should convert this to network byte order too. If you don't
|
||||
do this, your program may fail when running on or talking to other kinds
|
||||
@ -1550,7 +1551,7 @@ of machines.
|
||||
|
||||
If you use @code{getservbyname} and @code{gethostbyname} or
|
||||
@code{inet_addr} to get the port number and host address, the values are
|
||||
already in the network byte order, and you can copy them directly into
|
||||
already in network byte order, and you can copy them directly into
|
||||
the @code{sockaddr_in} structure.
|
||||
|
||||
Otherwise, you have to convert the values explicitly. Use @code{htons}
|
||||
@ -1581,7 +1582,7 @@ network byte order to host byte order.
|
||||
This function converts the @code{uint32_t} integer @var{hostlong} from
|
||||
host byte order to network byte order.
|
||||
|
||||
This is used for IPv4 internet addresses.
|
||||
This is used for IPv4 Internet addresses.
|
||||
@end deftypefun
|
||||
|
||||
@comment netinet/in.h
|
||||
@ -1590,7 +1591,7 @@ This is used for IPv4 internet addresses.
|
||||
This function converts the @code{uint32_t} integer @var{netlong} from
|
||||
network byte order to host byte order.
|
||||
|
||||
This is used for IPv4 internet addresses.
|
||||
This is used for IPv4 Internet addresses.
|
||||
@end deftypefun
|
||||
|
||||
@node Protocols Database
|
||||
@ -1598,7 +1599,7 @@ This is used for IPv4 internet addresses.
|
||||
@cindex protocols database
|
||||
|
||||
The communications protocol used with a socket controls low-level
|
||||
details of how data is exchanged. For example, the protocol implements
|
||||
details of how data are exchanged. For example, the protocol implements
|
||||
things like checksums to detect errors in transmissions, and routing
|
||||
instructions for messages. Normal user programs have little reason to
|
||||
mess with these details directly.
|
||||
@ -1665,8 +1666,8 @@ protocol, it returns a null pointer.
|
||||
@end deftypefun
|
||||
|
||||
You can also scan the whole protocols database one protocol at a time by
|
||||
using @code{setprotoent}, @code{getprotoent}, and @code{endprotoent}.
|
||||
Be careful in using these functions, because they are not reentrant.
|
||||
using @code{setprotoent}, @code{getprotoent} and @code{endprotoent}.
|
||||
Be careful when using these functions because they are not reentrant.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@ -1729,7 +1730,7 @@ CCITT. @file{socket.h} defines these symbols and others naming protocols
|
||||
not actually implemented.
|
||||
|
||||
@code{PF_IMPLINK} is used for communicating between hosts and Internet
|
||||
Message Processors. For information on this, and on @code{PF_ROUTE}, an
|
||||
Message Processors. For information on this and @code{PF_ROUTE}, an
|
||||
occasionally-used local area routing protocol, see the GNU Hurd Manual
|
||||
(to appear in the future).
|
||||
|
||||
@ -1783,7 +1784,7 @@ The process already has too many file descriptors open.
|
||||
The system already has too many file descriptors open.
|
||||
|
||||
@item EACCESS
|
||||
The process does not have privilege to create a socket of the specified
|
||||
The process does not have the privilege to create a socket of the specified
|
||||
@var{style} or @var{protocol}.
|
||||
|
||||
@item ENOBUFS
|
||||
@ -1791,7 +1792,7 @@ The system ran out of internal buffer space.
|
||||
@end table
|
||||
|
||||
The file descriptor returned by the @code{socket} function supports both
|
||||
read and write operations. But, like pipes, sockets do not support file
|
||||
read and write operations. However, like pipes, sockets do not support file
|
||||
positioning operations.
|
||||
@end deftypefun
|
||||
|
||||
@ -1806,7 +1807,7 @@ see @ref{Local Socket Example}, or @ref{Inet Example}.
|
||||
@cindex shutting down a socket
|
||||
@cindex socket shutdown
|
||||
|
||||
When you are finished using a socket, you can simply close its
|
||||
When you have finished using a socket, you can simply close its
|
||||
file descriptor with @code{close}; see @ref{Opening and Closing Files}.
|
||||
If there is still data waiting to be transmitted over the connection,
|
||||
normally @code{close} tries to complete this transmission. You
|
||||
@ -1814,7 +1815,7 @@ can control this behavior using the @code{SO_LINGER} socket option to
|
||||
specify a timeout period; see @ref{Socket Options}.
|
||||
|
||||
@pindex sys/socket.h
|
||||
You can also shut down only reception or only transmission on a
|
||||
You can also shut down only reception or transmission on a
|
||||
connection by calling @code{shutdown}, which is declared in
|
||||
@file{sys/socket.h}.
|
||||
|
||||
@ -1877,7 +1878,7 @@ This function creates a socket pair, returning the file descriptors in
|
||||
is a full-duplex communications channel, so that both reading and writing
|
||||
may be performed at either end.
|
||||
|
||||
The @var{namespace}, @var{style}, and @var{protocol} arguments are
|
||||
The @var{namespace}, @var{style} and @var{protocol} arguments are
|
||||
interpreted as for the @code{socket} function. @var{style} should be
|
||||
one of the communication styles listed in @ref{Communication Styles}.
|
||||
The @var{namespace} argument specifies the namespace, which must be
|
||||
@ -1927,12 +1928,12 @@ over and over. Making a connection is asymmetric; one side (the
|
||||
initiate a connection with a server.
|
||||
|
||||
@item
|
||||
@ref{Listening}, and @ref{Accepting Connections}, describe what the
|
||||
@ref{Listening} and @ref{Accepting Connections} describe what the
|
||||
server program must do to wait for and act upon connection requests
|
||||
from clients.
|
||||
|
||||
@item
|
||||
@ref{Transferring Data}, describes how data is transferred through the
|
||||
@ref{Transferring Data}, describes how data are transferred through the
|
||||
connected socket.
|
||||
@end itemize
|
||||
@end iftex
|
||||
@ -1959,7 +1960,7 @@ connected socket.
|
||||
|
||||
In making a connection, the client makes a connection while the server
|
||||
waits for and accepts the connection. Here we discuss what the client
|
||||
program must do, using the @code{connect} function, which is declared in
|
||||
program must do with the @code{connect} function, which is declared in
|
||||
@file{sys/socket.h}.
|
||||
|
||||
@comment sys/socket.h
|
||||
@ -2024,10 +2025,10 @@ The socket @var{socket} is non-blocking and already has a pending
|
||||
connection in progress (see @code{EINPROGRESS} above).
|
||||
@end table
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2052,7 +2053,7 @@ You can write a network server that does not even start running until a
|
||||
connection to it is requested. @xref{Inetd Servers}.
|
||||
|
||||
In the Internet namespace, there are no special protection mechanisms
|
||||
for controlling access to connect to a port; any process on any machine
|
||||
for controlling access to a port; any process on any machine
|
||||
can make a connection to your server. If you want to restrict access to
|
||||
your server, make it examine the addresses associated with connection
|
||||
requests or implement some other handshaking or identification
|
||||
@ -2099,7 +2100,7 @@ to do this.
|
||||
|
||||
A socket that has been established as a server can accept connection
|
||||
requests from multiple clients. The server's original socket
|
||||
@emph{does not become part} of the connection; instead, @code{accept}
|
||||
@emph{does not become part of the connection}; instead, @code{accept}
|
||||
makes a new socket which participates in the connection.
|
||||
@code{accept} returns the descriptor for this socket. The server's
|
||||
original socket remains available for listening for further connection
|
||||
@ -2108,7 +2109,7 @@ requests.
|
||||
The number of pending connection requests on a server socket is finite.
|
||||
If connection requests arrive from clients faster than the server can
|
||||
act upon them, the queue can fill up and additional requests are refused
|
||||
with a @code{ECONNREFUSED} error. You can specify the maximum length of
|
||||
with an @code{ECONNREFUSED} error. You can specify the maximum length of
|
||||
this queue as an argument to the @code{listen} function, although the
|
||||
system may also impose its own internal limit on the length of this
|
||||
queue.
|
||||
@ -2158,10 +2159,10 @@ The descriptor @var{socket} does not support this operation.
|
||||
connections immediately available.
|
||||
@end table
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2217,7 +2218,7 @@ In order to specify these modes, you must use the @code{recv} and
|
||||
@code{send} functions instead of the more generic @code{read} and
|
||||
@code{write} functions. The @code{recv} and @code{send} functions take
|
||||
an additional argument which you can use to specify various flags to
|
||||
control the special I/O modes. For example, you can specify the
|
||||
control special I/O modes. For example, you can specify the
|
||||
@code{MSG_OOB} flag to read or write out-of-band data, the
|
||||
@code{MSG_PEEK} flag to peek at input, or the @code{MSG_DONTROUTE} flag
|
||||
to control inclusion of routing information on output.
|
||||
@ -2290,10 +2291,10 @@ signal is ignored or blocked, or if its handler returns, then
|
||||
@code{send} fails with @code{EPIPE}.
|
||||
@end table
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2313,7 +2314,7 @@ The @code{recv} function is like @code{read}, but with the additional
|
||||
flags @var{flags}. The possible values of @var{flags} are described
|
||||
in @ref{Socket Data Options}.
|
||||
|
||||
If nonblocking mode is set for @var{socket}, and no data is available to
|
||||
If nonblocking mode is set for @var{socket}, and no data are available to
|
||||
be read, @code{recv} fails immediately rather than waiting. @xref{File
|
||||
Status Flags}, for information about nonblocking mode.
|
||||
|
||||
@ -2340,10 +2341,10 @@ The operation was interrupted by a signal before any data was read.
|
||||
You never connected this socket.
|
||||
@end table
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2424,18 +2425,18 @@ This program uses @code{make_socket} to set up the socket address; see
|
||||
Streams with connections permit @dfn{out-of-band} data that is
|
||||
delivered with higher priority than ordinary data. Typically the
|
||||
reason for sending out-of-band data is to send notice of an
|
||||
exceptional condition. The way to send out-of-band data is using
|
||||
exceptional condition. To send out-of-band data use
|
||||
@code{send}, specifying the flag @code{MSG_OOB} (@pxref{Sending
|
||||
Data}).
|
||||
|
||||
Out-of-band data is received with higher priority because the
|
||||
Out-of-band data are received with higher priority because the
|
||||
receiving process need not read it in sequence; to read the next
|
||||
available out-of-band data, use @code{recv} with the @code{MSG_OOB}
|
||||
flag (@pxref{Receiving Data}). Ordinary read operations do not read
|
||||
out-of-band data; they read only the ordinary data.
|
||||
out-of-band data; they read only ordinary data.
|
||||
|
||||
@cindex urgent socket condition
|
||||
When a socket finds that out-of-band data is on its way, it sends a
|
||||
When a socket finds that out-of-band data are on their way, it sends a
|
||||
@code{SIGURG} signal to the owner process or process group of the
|
||||
socket. You can specify the owner using the @code{F_SETOWN} command
|
||||
to the @code{fcntl} function; see @ref{Interrupt Input}. You must
|
||||
@ -2449,7 +2450,7 @@ can wait for an exceptional condition on the socket. @xref{Waiting
|
||||
for I/O}, for more information about @code{select}.
|
||||
|
||||
Notification of out-of-band data (whether with @code{SIGURG} or with
|
||||
@code{select}) indicates that out-of-band data is on the way; the data
|
||||
@code{select}) indicates that out-of-band data are on the way; the data
|
||||
may not actually arrive until later. If you try to read the
|
||||
out-of-band data before it arrives, @code{recv} fails with an
|
||||
@code{EWOULDBLOCK} error.
|
||||
@ -2522,7 +2523,7 @@ struct buffer
|
||||
|
||||
@r{It may be necessary to read some ordinary data}
|
||||
@r{in order to make room for the out-of-band data.}
|
||||
@r{If so, the ordinary data is saved as a chain of buffers}
|
||||
@r{If so, the ordinary data are saved as a chain of buffers}
|
||||
@r{found in the `next' field of the value.} */
|
||||
|
||||
struct buffer *
|
||||
@ -2599,7 +2600,7 @@ these styles, you group data into packets and each packet is an
|
||||
independent communication. You specify the destination for each
|
||||
packet individually.
|
||||
|
||||
Datagram packets are like letters: you send each one independently,
|
||||
Datagram packets are like letters: you send each one independently
|
||||
with its own destination address, and they may arrive in the wrong
|
||||
order or not at all.
|
||||
|
||||
@ -2626,7 +2627,7 @@ The normal way of sending data on a datagram socket is by using the
|
||||
|
||||
You can call @code{connect} on a datagram socket, but this only
|
||||
specifies a default destination for further data transmission on the
|
||||
socket. When a socket has a default destination, then you can use
|
||||
socket. When a socket has a default destination you can use
|
||||
@code{send} (@pxref{Sending Data}) or even @code{write} (@pxref{I/O
|
||||
Primitives}) to send a packet there. You can cancel the default
|
||||
destination by calling @code{connect} using an address format of
|
||||
@ -2647,16 +2648,16 @@ The @var{flags} are interpreted the same way as for @code{send}; see
|
||||
The return value and error conditions are also the same as for
|
||||
@code{send}, but you cannot rely on the system to detect errors and
|
||||
report them; the most common error is that the packet is lost or there
|
||||
is no one at the specified address to receive it, and the operating
|
||||
is no-one at the specified address to receive it, and the operating
|
||||
system on your machine usually does not know this.
|
||||
|
||||
It is also possible for one call to @code{sendto} to report an error
|
||||
due to a problem related to a previous call.
|
||||
owing to a problem related to a previous call.
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2676,13 +2677,13 @@ The @code{recvfrom} function reads one packet from the socket
|
||||
specifies the maximum number of bytes to be read.
|
||||
|
||||
If the packet is longer than @var{size} bytes, then you get the first
|
||||
@var{size} bytes of the packet, and the rest of the packet is lost.
|
||||
@var{size} bytes of the packet and the rest of the packet is lost.
|
||||
There's no way to read the rest of the packet. Thus, when you use a
|
||||
packet protocol, you must always know how long a packet to expect.
|
||||
|
||||
The @var{addr} and @var{length-ptr} arguments are used to return the
|
||||
address where the packet came from. @xref{Socket Addresses}. For a
|
||||
socket in the local domain, the address information won't be meaningful,
|
||||
socket in the local domain the address information won't be meaningful,
|
||||
since you can't read the address of such a socket (@pxref{Local
|
||||
Namespace}). You can specify a null pointer as the @var{addr} argument
|
||||
if you are not interested in this information.
|
||||
@ -2691,15 +2692,15 @@ The @var{flags} are interpreted the same way as for @code{recv}
|
||||
(@pxref{Socket Data Options}). The return value and error conditions
|
||||
are also the same as for @code{recv}.
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
You can use plain @code{recv} (@pxref{Receiving Data}) instead of
|
||||
@code{recvfrom} if you know don't need to find out who sent the packet
|
||||
@code{recvfrom} if you don't need to find out who sent the packet
|
||||
(either because you know where it should come from or because you
|
||||
treat all possible senders alike). Even @code{read} can be used if
|
||||
you don't want to specify @var{flags} (@pxref{I/O Primitives}).
|
||||
@ -2719,10 +2720,10 @@ you don't want to specify @var{flags} (@pxref{I/O Primitives}).
|
||||
@comment BSD
|
||||
@deftypefun int sendmsg (int @var{socket}, const struct msghdr *@var{message}, int @var{flags})
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is cancel.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is cancel.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
|
||||
@ -2730,10 +2731,10 @@ semaphores or whatever) are freed even if the thread is cancel.
|
||||
@comment BSD
|
||||
@deftypefun int recvmsg (int @var{socket}, struct msghdr *@var{message}, int @var{flags})
|
||||
|
||||
This function is defined as a cancelation point in multi-threaded
|
||||
programs. So one has to be prepared for this and make sure that
|
||||
possibly allocated resources (like memory, files descriptors,
|
||||
semaphores or whatever) are freed even if the thread is canceled.
|
||||
This function is defined as a cancellation point in multi-threaded
|
||||
programs, so one has to be prepared for this and make sure that
|
||||
allocated resources (like memory, files descriptors, semaphores or
|
||||
whatever) are freed even if the thread is canceled.
|
||||
@c @xref{pthread_cleanup_push}, for a method how to do this.
|
||||
@end deftypefun
|
||||
@end ignore
|
||||
@ -2748,7 +2749,7 @@ Socket Example}, to create and name their sockets.
|
||||
|
||||
First, here is the server program. It sits in a loop waiting for
|
||||
messages to arrive, bouncing each message back to the sender.
|
||||
Obviously, this isn't a particularly useful program, but it does show
|
||||
Obviously this isn't a particularly useful program, but it does show
|
||||
the general ideas involved.
|
||||
|
||||
@smallexample
|
||||
@ -2774,10 +2775,10 @@ referencing the name of the client.
|
||||
Keep in mind that datagram socket communications are unreliable. In
|
||||
this example, the client program waits indefinitely if the message
|
||||
never reaches the server or if the server's response never comes
|
||||
back. It's up to the user running the program to kill it and restart
|
||||
it, if desired. A more automatic solution could be to use
|
||||
back. It's up to the user running the program to kill and restart
|
||||
it if desired. A more automatic solution could be to use
|
||||
@code{select} (@pxref{Waiting for I/O}) to establish a timeout period
|
||||
for the reply, and in case of timeout either resend the message or
|
||||
for the reply, and in case of timeout either re-send the message or
|
||||
shut down the socket and exit.
|
||||
|
||||
@node Inetd
|
||||
@ -2787,7 +2788,7 @@ We've explained above how to write a server program that does its own
|
||||
listening. Such a server must already be running in order for anyone
|
||||
to connect to it.
|
||||
|
||||
Another way to provide service for an Internet port is to let the daemon
|
||||
Another way to provide a service on an Internet port is to let the daemon
|
||||
program @code{inetd} do the listening. @code{inetd} is a program that
|
||||
runs all the time and waits (using @code{select}) for messages on a
|
||||
specified set of ports. When it receives a message, it accepts the
|
||||
@ -2808,19 +2809,19 @@ someone requests a connection to the appropriate port, a new server
|
||||
process starts. The connection already exists at this time; the
|
||||
socket is available as the standard input descriptor and as the
|
||||
standard output descriptor (descriptors 0 and 1) in the server
|
||||
process. So the server program can begin reading and writing data
|
||||
process. Thus the server program can begin reading and writing data
|
||||
right away. Often the program needs only the ordinary I/O facilities;
|
||||
in fact, a general-purpose filter program that knows nothing about
|
||||
sockets can work as a byte stream server run by @code{inetd}.
|
||||
|
||||
You can also use @code{inetd} for servers that use connectionless
|
||||
communication styles. For these servers, @code{inetd} does not try to accept
|
||||
a connection, since no connection is possible. It just starts the
|
||||
a connection since no connection is possible. It just starts the
|
||||
server program, which can read the incoming datagram packet from
|
||||
descriptor 0. The server program can handle one request and then
|
||||
exit, or you can choose to write it to keep reading more requests
|
||||
until no more arrive, and then exit. You must specify which of these
|
||||
two techniques the server uses, when you configure @code{inetd}.
|
||||
two techniques the server uses when you configure @code{inetd}.
|
||||
|
||||
@node Configuring Inetd
|
||||
@subsection Configuring @code{inetd}
|
||||
@ -2859,7 +2860,7 @@ byte stream connections and @samp{udp} for unreliable datagrams.
|
||||
|
||||
The @var{wait} field should be either @samp{wait} or @samp{nowait}.
|
||||
Use @samp{wait} if @var{style} is a connectionless style and the
|
||||
server, once started, handles multiple requests, as many as come in.
|
||||
server, once started, handles multiple requests as they come in.
|
||||
Use @samp{nowait} if @code{inetd} should start a new process for each message
|
||||
or request that comes in. If @var{style} uses connections, then
|
||||
@var{wait} @strong{must} be @samp{nowait}.
|
||||
@ -2882,7 +2883,7 @@ program name itself (sans directories).
|
||||
If you edit @file{/etc/inetd.conf}, you can tell @code{inetd} to reread the
|
||||
file and obey its new contents by sending the @code{inetd} process the
|
||||
@code{SIGHUP} signal. You'll have to use @code{ps} to determine the
|
||||
process ID of the @code{inetd} process, as it is not fixed.
|
||||
process ID of the @code{inetd} process as it is not fixed.
|
||||
|
||||
@c !!! could document /etc/inetd.sec
|
||||
|
||||
@ -2948,7 +2949,7 @@ The @var{optname} doesn't make sense for the given @var{level}.
|
||||
@deftypefun int setsockopt (int @var{socket}, int @var{level}, int @var{optname}, void *@var{optval}, socklen_t @var{optlen})
|
||||
This function is used to set the socket option @var{optname} at level
|
||||
@var{level} for socket @var{socket}. The value of the option is passed
|
||||
in the buffer @var{optval}, which has size @var{optlen}.
|
||||
in the buffer @var{optval} of size @var{optlen}.
|
||||
|
||||
@c Argh. -zw
|
||||
@iftex
|
||||
@ -2989,7 +2990,7 @@ This option toggles recording of debugging information in the underlying
|
||||
protocol modules. The value has type @code{int}; a nonzero value means
|
||||
``yes''.
|
||||
@c !!! should say how this is used
|
||||
@c Ok, anyone who knows, please explain.
|
||||
@c OK, anyone who knows, please explain.
|
||||
|
||||
@comment sys/socket.h
|
||||
@comment BSD
|
||||
@ -3037,7 +3038,7 @@ This structure type has the following members:
|
||||
@table @code
|
||||
@item int l_onoff
|
||||
This field is interpreted as a boolean. If nonzero, @code{close}
|
||||
blocks until the data is transmitted or the timeout period has expired.
|
||||
blocks until the data are transmitted or the timeout period has expired.
|
||||
|
||||
@item int l_linger
|
||||
This specifies the timeout period, in seconds.
|
||||
@ -3107,7 +3108,7 @@ to the system developer. This is usually kept either in the file
|
||||
@file{/etc/networks} or in an equivalent from a name server. This data
|
||||
base is useful for routing programs such as @code{route}, but it is not
|
||||
useful for programs that simply communicate over the network. We
|
||||
provide functions to access this data base, which are declared in
|
||||
provide functions to access this database, which are declared in
|
||||
@file{netdb.h}.
|
||||
|
||||
@comment netdb.h
|
||||
@ -3159,8 +3160,8 @@ network.
|
||||
@end deftypefun
|
||||
|
||||
You can also scan the networks database using @code{setnetent},
|
||||
@code{getnetent}, and @code{endnetent}. Be careful in using these
|
||||
functions, because they are not reentrant.
|
||||
@code{getnetent} and @code{endnetent}. Be careful when using these
|
||||
functions because they are not reentrant.
|
||||
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
|
@ -1847,14 +1847,14 @@ The information is stored in the array @var{argtypes}; each element of
|
||||
this array describes one argument. This information is encoded using
|
||||
the various @samp{PA_} macros, listed below.
|
||||
|
||||
The @var{n} argument specifies the number of elements in the array
|
||||
@var{argtypes}. This is the most elements that
|
||||
The argument @var{n} specifies the number of elements in the array
|
||||
@var{argtypes}. This is the maximum number of elements that
|
||||
@code{parse_printf_format} will try to write.
|
||||
|
||||
@code{parse_printf_format} returns the total number of arguments required
|
||||
by @var{template}. If this number is greater than @var{n}, then the
|
||||
information returned describes only the first @var{n} arguments. If you
|
||||
want information about more than that many arguments, allocate a bigger
|
||||
want information about additional arguments, allocate a bigger
|
||||
array and call @code{parse_printf_format} again.
|
||||
@end deftypefun
|
||||
|
||||
@ -2107,9 +2107,9 @@ about this.
|
||||
@c but if you are never going to call @code{parse_printf_format}, you do
|
||||
@c not need to define an arginfo function.
|
||||
|
||||
@strong{Attention:} In the GNU C library version before 2.0 the
|
||||
@strong{Attention:} In the GNU C library versions before 2.0 the
|
||||
@var{arginfo-function} function did not need to be installed unless
|
||||
the user uses the @code{parse_printf_format} function. This changed.
|
||||
the user used the @code{parse_printf_format} function. This has changed.
|
||||
Now a call to any of the @code{printf} functions will call this
|
||||
function when this format specifier appears in the format string.
|
||||
|
||||
@ -2220,7 +2220,7 @@ width. The value is @code{'0'} if the @samp{0} flag was specified, and
|
||||
Now let's look at how to define the handler and arginfo functions
|
||||
which are passed as arguments to @code{register_printf_function}.
|
||||
|
||||
@strong{Compatibility Note:} The interface changed in the GNU libc
|
||||
@strong{Compatibility Note:} The interface changed in GNU libc
|
||||
version 2.0. Previously the third argument was of type
|
||||
@code{va_list *}.
|
||||
|
||||
@ -2254,7 +2254,7 @@ a description of this data structure.
|
||||
@c arguments that your handler processes. @xref{Variadic Functions}.)
|
||||
|
||||
The @var{args} is a vector of pointers to the arguments data.
|
||||
The number of arguments were determined by calling the argument
|
||||
The number of arguments was determined by calling the argument
|
||||
information function provided by the user.
|
||||
|
||||
Your handler function should return a value just like @code{printf}
|
||||
@ -2328,7 +2328,7 @@ which implement a special way to print floating-point numbers.
|
||||
Print a given floating point number as for the format @code{%f} except
|
||||
that there is a postfix character indicating the divisor for the
|
||||
number to make this less than 1000. There are two possible divisors:
|
||||
powers of 1024 or powers to 1000. Which one is used depends on the
|
||||
powers of 1024 or powers of 1000. Which one is used depends on the
|
||||
format character specified while registered this handler. If the
|
||||
character is of lower case, 1024 is used. For upper case characters,
|
||||
1000 is used.
|
||||
@ -2378,7 +2378,7 @@ format character as if it were @code{%.3fk} and will yield @code{1.000k}.
|
||||
@end deftypefun
|
||||
|
||||
Due to the requirements of @code{register_printf_function} we must also
|
||||
provide the function which return information about the arguments.
|
||||
provide the function which returns information about the arguments.
|
||||
|
||||
@comment printf.h
|
||||
@comment GNU
|
||||
@ -2403,14 +2403,14 @@ register_printf_function ('b', printf_size, printf_size_info);
|
||||
@end smallexample
|
||||
|
||||
@noindent
|
||||
we could also print using power of 1024. Please note that all what is
|
||||
different in these both lines in the format specifier. The
|
||||
@code{printf_size} function knows about the difference of low and upper
|
||||
we could also print using a power of 1024. Please note that all that is
|
||||
different in these two lines is the format specifier. The
|
||||
@code{printf_size} function knows about the difference between lower and upper
|
||||
case format specifiers.
|
||||
|
||||
The use of @code{'B'} and @code{'b'} is no coincidence. Rather it is
|
||||
the preferred way to use this functionality since it is available on
|
||||
some other systems also available using the format specifiers.
|
||||
some other systems which also use format specifiers.
|
||||
|
||||
@node Formatted Input
|
||||
@section Formatted Input
|
||||
@ -2784,7 +2784,7 @@ in. @xref{Dynamic String Input}.
|
||||
@end itemize
|
||||
|
||||
The @samp{%c} conversion is the simplest: it matches a fixed number of
|
||||
characters, always. The maximum field with says how many characters to
|
||||
characters, always. The maximum field width says how many characters to
|
||||
read; if you don't specify the maximum, the default is 1. This
|
||||
conversion doesn't append a null character to the end of the text it
|
||||
reads. It also does not skip over initial whitespace characters. It
|
||||
@ -2903,7 +2903,7 @@ conversion specification to read a ``variable assignment'' of the form
|
||||
This section describes the miscellaneous input conversions.
|
||||
|
||||
The @samp{%p} conversion is used to read a pointer value. It recognizes
|
||||
the same syntax as is used by the @samp{%p} output conversion for
|
||||
the same syntax used by the @samp{%p} output conversion for
|
||||
@code{printf} (@pxref{Other Output Conversions}); that is, a hexadecimal
|
||||
number just as the @samp{%x} conversion accepts. The corresponding
|
||||
argument should be of type @code{void **}; that is, the address of a
|
||||
@ -2946,9 +2946,9 @@ The optional arguments are pointers to the places which receive the
|
||||
resulting values.
|
||||
|
||||
The return value is normally the number of successful assignments. If
|
||||
an end-of-file condition is detected before any matches are performed
|
||||
(including matches against whitespace and literal characters in the
|
||||
template), then @code{EOF} is returned.
|
||||
an end-of-file condition is detected before any matches are performed,
|
||||
including matches against whitespace and literal characters in the
|
||||
template, then @code{EOF} is returned.
|
||||
@end deftypefun
|
||||
|
||||
@comment stdio.h
|
||||
@ -2987,7 +2987,7 @@ extensions.
|
||||
@comment stdio.h
|
||||
@comment GNU
|
||||
@deftypefun int vscanf (const char *@var{template}, va_list @var{ap})
|
||||
This function is similar to @code{scanf} except that, instead of taking
|
||||
This function is similar to @code{scanf}, but instead of taking
|
||||
a variable number of arguments directly, it takes an argument list
|
||||
pointer @var{ap} of type @code{va_list} (@pxref{Variadic Functions}).
|
||||
@end deftypefun
|
||||
@ -3010,8 +3010,8 @@ In GNU C, there is a special construct you can use to let the compiler
|
||||
know that a function uses a @code{scanf}-style format string. Then it
|
||||
can check the number and types of arguments in each call to the
|
||||
function, and warn you when they do not match the format string.
|
||||
@xref{Function Attributes, , Declaring Attributes of Functions,
|
||||
gcc.info, Using GNU CC}, for details.
|
||||
For details, @xref{Function Attributes, , Declaring Attributes of Functions,
|
||||
gcc.info, Using GNU CC}.
|
||||
|
||||
@node EOF and Errors
|
||||
@section End-Of-File and Errors
|
||||
@ -3169,18 +3169,15 @@ possibly for other reasons as well. If a failure occurs, a value of
|
||||
@comment stdio.h
|
||||
@comment Unix98
|
||||
@deftypefun off_t ftello (FILE *@var{stream})
|
||||
The @code{ftello} function is similar to @code{ftell} only it corrects a
|
||||
problem which the POSIX type system. In this type system all file
|
||||
positions are described using values of type @code{off_t} which is not
|
||||
necessarily of the same size as @code{long int}. Therefore using
|
||||
@code{ftell} can lead to problems if the implementation is written on
|
||||
top of a POSIX compliant lowlevel I/O implementation.
|
||||
The @code{ftello} function is similar to @code{ftell}, except that it
|
||||
returns a value of type @code{off_t}. Systems which support this type
|
||||
use it to describe all file positions, unlike the POSIX specification
|
||||
which uses a long int. The two are not necessarily the same size.
|
||||
Therefore, using ftell can lead to problems if the implementation is
|
||||
written on top of a POSIX compliant low-level I/O implementation, and using
|
||||
@code{ftello} is preferable whenever it is available.
|
||||
|
||||
Therefore it is a good idea to prefer @code{ftello} whenever it is
|
||||
available since its functionality is (if different at all) closer the
|
||||
underlying definition.
|
||||
|
||||
If this function fails it return @code{(off_t) -1}. This can happen due
|
||||
If this function fails it returns @code{(off_t) -1}. This can happen due
|
||||
to missing support for file positioning or internal errors. Otherwise
|
||||
the return value is the current file position.
|
||||
|
||||
@ -3360,9 +3357,9 @@ the same file position.
|
||||
|
||||
@item
|
||||
In a call to @code{fseek} or @code{fseeko} on a text stream, either the
|
||||
@var{offset} must either be zero; or @var{whence} must be
|
||||
@code{SEEK_SET} and the @var{offset} must be the result of an earlier
|
||||
call to @code{ftell} on the same stream.
|
||||
@var{offset} must be zero, or @var{whence} must be @code{SEEK_SET} and
|
||||
and the @var{offset} must be the result of an earlier call to @code{ftell}
|
||||
on the same stream.
|
||||
|
||||
@item
|
||||
The value of the file position indicator of a text stream is undefined
|
||||
@ -3484,7 +3481,7 @@ If you are writing programs that do interactive input and output using
|
||||
streams, you need to understand how buffering works when you design the
|
||||
user interface to your program. Otherwise, you might find that output
|
||||
(such as progress or prompt messages) doesn't appear when you intended
|
||||
it to, or other unexpected behavior.
|
||||
it to, or displays some other unexpected behavior.
|
||||
|
||||
This section deals only with controlling when characters are transmitted
|
||||
between the stream and the file or device, and @emph{not} with how
|
||||
@ -3756,8 +3753,8 @@ This function opens a stream that allows the access specified by the
|
||||
by the argument @var{buf}. This array must be at least @var{size} bytes long.
|
||||
|
||||
If you specify a null pointer as the @var{buf} argument, @code{fmemopen}
|
||||
dynamically allocates (as with @code{malloc}; @pxref{Unconstrained
|
||||
Allocation}) an array @var{size} bytes long. This is really only useful
|
||||
dynamically allocates an array @var{size} bytes long (as with @code{malloc};
|
||||
@pxref{Unconstrained Allocation}). This is really only useful
|
||||
if you are going to write things to the buffer and then read them back
|
||||
in again, because you have no way of actually getting a pointer to the
|
||||
buffer (for this, try @code{open_memstream}, below). The buffer is
|
||||
@ -4162,7 +4159,7 @@ Display a message described by its parameters on the device(s) specified
|
||||
in the @var{classification} parameter. The @var{label} parameter
|
||||
identifies the source of the message. The string should consist of two
|
||||
colon separated parts where the first part has not more than 10 and the
|
||||
second part not more the 14 characters. The @var{text} parameter
|
||||
second part not more than 14 characters. The @var{text} parameter
|
||||
describes the condition of the error, the @var{action} parameter possible
|
||||
steps to recover from the error and the @var{tag} parameter is a
|
||||
reference to the online documentation where more information can be
|
||||
@ -4228,7 +4225,7 @@ inserted if necessary, i.e., if the corresponding parameter is not
|
||||
ignored.
|
||||
|
||||
This function is specified in the X/Open Portability Guide. It is also
|
||||
available on all system derived from System V.
|
||||
available on all systems derived from System V.
|
||||
|
||||
The function returns the value @code{MM_OK} if no error occurred. If
|
||||
only the printing to standard error failed, it returns @code{MM_NOMSG}.
|
||||
@ -4241,7 +4238,7 @@ is incorrect.
|
||||
There are two environment variables which influence the behaviour of
|
||||
@code{fmtmsg}. The first is @code{MSGVERB}. It is used to control the
|
||||
output actually happening on standard error (@emph{not} the console
|
||||
output). Each of the five fields can explicitely be enabled. To do
|
||||
output). Each of the five fields can explicitly be enabled. To do
|
||||
this the user has to put the @code{MSGVERB} variable with a format like
|
||||
the following in the environment before calling the @code{fmtmsg} function
|
||||
the first time:
|
||||
@ -4291,17 +4288,17 @@ not print the numeric value but instead the string representation).
|
||||
@subsection Adding Severity Classes
|
||||
@cindex severity class
|
||||
|
||||
There is another possibility to introduce severity classes beside using
|
||||
There is another possibility to introduce severity classes besides using
|
||||
the environment variable @code{SEV_LEVEL}. This simplifies the task of
|
||||
introducing new classes in a running program. One could use the
|
||||
@code{setenv} or @code{putenv} function to set the environment variable,
|
||||
but this is toilsome.
|
||||
|
||||
@deftypefun int addseverity (int @var{severity}, const char *@var{string})
|
||||
This function allows to introduce new severity classes which can be
|
||||
This function allows the introduction of new severity classes which can be
|
||||
addressed by the @var{severity} parameter of the @code{fmtmsg} function.
|
||||
The @var{severity} parameter of @code{addseverity} must match the value
|
||||
for the parameter with the same name of @code{fmtmsg} and @var{string}
|
||||
for the parameter with the same name of @code{fmtmsg}, and @var{string}
|
||||
is the string printed in the actual messages instead of the numeric
|
||||
value.
|
||||
|
||||
@ -4332,14 +4329,14 @@ functions described in this section.
|
||||
@include fmtmsgexpl.c.texi
|
||||
@end smallexample
|
||||
|
||||
The second call to @code{fmtmsg} illustrates a use of this function how
|
||||
it usually happens on System V systems which heavily use this function.
|
||||
It might be worth a thought to follow the scheme used in System V
|
||||
systems so we give a short explanation here. The value of the
|
||||
The second call to @code{fmtmsg} illustrates a use of this function as
|
||||
it usually occurs on System V systems, which heavily use this function.
|
||||
It seems worthwhile to give a short explanation here of how this system
|
||||
works on System V. The value of the
|
||||
@var{label} field (@code{UX:cat}) says that the error occured in the
|
||||
Unix program @code{cat}. The explanation of the error follows and the
|
||||
value for the @var{action} parameter is @code{"refer to manual"}. One
|
||||
could me more specific here, if needed. The @var{tag} field contains,
|
||||
could be more specific here, if necessary. The @var{tag} field contains,
|
||||
as proposed above, the value of the string given for the @var{label}
|
||||
parameter, and additionally a unique ID (@code{001} in this case). For
|
||||
a GNU environment this string could contain a reference to the
|
||||
@ -4362,7 +4359,7 @@ form. The string must contain two fields, separated by a colon
|
||||
(@pxref{Printing Formatted Messages}). The third @code{fmtmsg} call
|
||||
produced no output since the class with the numeric value @code{6} is
|
||||
not defined. Although a class with numeric value @code{5} is also not
|
||||
defined by default, the call the @code{addseverity} introduces it and
|
||||
defined by default, the call to @code{addseverity} introduces it and
|
||||
the second call to @code{fmtmsg} produces the above output.
|
||||
|
||||
When we change the environment of the program to contain
|
||||
@ -4375,11 +4372,11 @@ label:foo: NOTE: text
|
||||
TO FIX: action tag
|
||||
@end smallexample
|
||||
|
||||
Now the third call the @code{fmtmsg} produced some output and we see how
|
||||
Now the third call to @code{fmtmsg} produced some output and we see how
|
||||
the string @code{NOTE} from the environment variable appears in the
|
||||
message.
|
||||
|
||||
Now we can reduce the output by specifying in which fields we are
|
||||
Now we can reduce the output by specifying which fields we are
|
||||
interested in. If we additionally set the environment variable
|
||||
@code{MSGVERB} to the value @code{severity:label:action} we get the
|
||||
following output:
|
||||
@ -4395,5 +4392,5 @@ TO FIX: action
|
||||
I.e., the output produced by the @var{text} and the @var{tag} parameters
|
||||
to @code{fmtmsg} vanished. Please also note that now there is no colon
|
||||
after the @code{NOTE} and @code{NOTE2} strings in the output. This is
|
||||
not necessary since there is no more output on this line since the text
|
||||
not necessary since there is no more output on this line because the text
|
||||
is missing.
|
||||
|
@ -82,7 +82,7 @@ This process cannot set the host name because it is not privileged.
|
||||
@deftypefun {long int} gethostid (void)
|
||||
This function returns the ``host ID'' of the machine the program is
|
||||
running on. By convention, this is usually the primary Internet address
|
||||
of that machine, converted to a @w{@code{long int}}. However, some
|
||||
of that machine, converted to a @w{@code{long int}}. However, on some
|
||||
systems it is a meaningless but unique number which is hard-coded for
|
||||
each machine.
|
||||
@end deftypefun
|
||||
@ -95,7 +95,7 @@ to @var{id}. Only privileged processes are allowed to do this. Usually
|
||||
it happens just once, at system boot time.
|
||||
|
||||
The return value is @code{0} on success and @code{-1} on failure.
|
||||
The following @code{errno} error condition is defined for this function:
|
||||
The following @code{errno} error conditions are defined for this function:
|
||||
|
||||
@table @code
|
||||
@item EPERM
|
||||
@ -186,10 +186,10 @@ possibility.
|
||||
@section Which filesystems are mounted and/or available?
|
||||
|
||||
The Unix concept of @emph{Everything is a file} is based on the
|
||||
possibility to @dfn{mount} filesystems or other things into the
|
||||
ability to @dfn{mount} filesystems or other things into the
|
||||
filesystem. For some programs it is desirable and necessary to access
|
||||
the information whether and, if yes, where a certain filesystem is
|
||||
mounted or simply to get lists of all the available filesystems. The
|
||||
information about whether a certain filesystem is mounted and, if it is,
|
||||
where, or simply to get lists of all the available filesystems. The
|
||||
GNU libc provides some functions to retrieve this information portably.
|
||||
|
||||
Traditionally Unix systems have a file named @file{/etc/fstab} which
|
||||
@ -252,7 +252,7 @@ more than one option, separated from the others by a comma. Each option
|
||||
consists of a name and an optional value part, introduced by an @code{=}
|
||||
character.
|
||||
|
||||
If the value of this element must be processed it should best happen
|
||||
If the value of this element must be processed it should ideally be done
|
||||
using the @code{getsubopt} function; see @ref{Suboptions}.
|
||||
|
||||
@item const char *fs_type
|
||||
@ -323,7 +323,7 @@ is the first call to any of the functions handling @file{fstab} since
|
||||
program start or the last call of @code{endfsent}, the file will be
|
||||
opened.
|
||||
|
||||
The function returns a pointer to an variable of type @code{struct
|
||||
The function returns a pointer to a variable of type @code{struct
|
||||
fstab}. This variable is shared by all threads and therefore this
|
||||
function is not thread-safe. If an error occurred @code{getfsent}
|
||||
returns a @code{NULL} pointer.
|
||||
@ -340,7 +340,7 @@ argument. If this is the first call to any of the functions handling
|
||||
@file{fstab} since program start or the last call of @code{endfsent},
|
||||
the file will be opened.
|
||||
|
||||
The function returns a pointer to an variable of type @code{struct
|
||||
The function returns a pointer to a variable of type @code{struct
|
||||
fstab}. This variable is shared by all threads and therefore this
|
||||
function is not thread-safe. If an error occurred @code{getfsent}
|
||||
returns a @code{NULL} pointer.
|
||||
@ -357,7 +357,7 @@ argument. If this is the first call to any of the functions handling
|
||||
@file{fstab} since program start or the last call of @code{endfsent},
|
||||
the file will be opened.
|
||||
|
||||
The function returns a pointer to an variable of type @code{struct
|
||||
The function returns a pointer to a variable of type @code{struct
|
||||
fstab}. This variable is shared by all threads and therefore this
|
||||
function is not thread-safe. If an error occurred @code{getfsent}
|
||||
returns a @code{NULL} pointer.
|
||||
@ -387,11 +387,11 @@ filesystem. It corresponds to the @code{fs_file} element in
|
||||
@item char *mnt_type
|
||||
@code{mnt_type} describes the filesystem type and is therefore
|
||||
equivalent to @code{fs_vfstype} in @code{struct fstab}. @file{mntent.h}
|
||||
defines a few symbolic names for some of the value this string can have.
|
||||
But since the kernel can support an arbitrary filesystems it does not
|
||||
defines a few symbolic names for some of the values this string can have.
|
||||
But since the kernel can support arbitrary filesystems it does not
|
||||
make much sense to give them symbolic names. If one knows the symbol
|
||||
name one also knows the filesystem name. Nevertheless here follows the
|
||||
list of the symbol provided in @file{mntent.h}.
|
||||
list of the symbols provided in @file{mntent.h}.
|
||||
|
||||
@vtable @code
|
||||
@item MNTTYPE_IGNORE
|
||||
@ -414,7 +414,7 @@ the filesystem. As for the equivalent element @code{fs_mntops} of
|
||||
|
||||
The @file{mntent.h} file defines a number of macros with string values
|
||||
which correspond to some of the options understood by the kernel. There
|
||||
might be many more options which are possible so it makes not much sense
|
||||
might be many more options which are possible so it doesn't make much sense
|
||||
to rely on these macros but to be consistent here is the list:
|
||||
|
||||
@vtable @code
|
||||
@ -539,7 +539,7 @@ end of file reached,
|
||||
@comment mntent.h
|
||||
@comment BSD
|
||||
@deftypefun int addmntent (FILE *@var{stream}, const struct mntent *@var{mnt})
|
||||
The @code{addmntent} function allows to add a new entry to the file
|
||||
The @code{addmntent} function allows adding a new entry to the file
|
||||
previously opened with @code{setmntent}. The new entries are always
|
||||
appended. I.e., even if the position of the file descriptor is not at
|
||||
the end of the file this function does not overwrite an existing entry
|
||||
|
@ -1071,7 +1071,7 @@ the user accounting database.
|
||||
|
||||
All the @code{get*} functions mentioned before store the information
|
||||
they return in a static buffer. This can be a problem in multi-threaded
|
||||
programs since the data return for the request is overwritten be the
|
||||
programs since the data returned for the request is overwritten by the
|
||||
return value data in another thread. Therefore the GNU C Library
|
||||
provides as extensions three more functions which return the data in a
|
||||
user-provided buffer.
|
||||
@ -1853,16 +1853,16 @@ group of users with a certain machine. On the other hand grouping of
|
||||
host names is not supported so far.
|
||||
|
||||
In Sun Microsystems SunOS appeared a new kind of database, the netgroup
|
||||
database. It allows to group hosts, users, and domain freely, giving
|
||||
them individual names. More concrete: a netgroup is a list of triples
|
||||
consisting of a host name, a user name, and a domain name, where any of
|
||||
the entries can be a wildcard entry, matching all inputs. A last
|
||||
database. It allows grouping hosts, users, and domains freely, giving
|
||||
them individual names. To be more concrete, a netgroup is a list of triples
|
||||
consisting of a host name, a user name, and a domain name where any of
|
||||
the entries can be a wildcard entry matching all inputs. A last
|
||||
possibility is that names of other netgroups can also be given in the
|
||||
list specifying a netgroup. So one can construct arbitrary hierarchies
|
||||
without loops.
|
||||
|
||||
Sun's implementation allows netgroups only for the @code{nis} or
|
||||
@code{nisplus} service @pxref{Services in the NSS configuration}. The
|
||||
@code{nisplus} service, @pxref{Services in the NSS configuration}. The
|
||||
implementation in the GNU C library has no such restriction. An entry
|
||||
in either of the input services must have the following form:
|
||||
|
||||
@ -1873,7 +1873,7 @@ in either of the input services must have the following form:
|
||||
Any of the fields in the triple can be empty which means anything
|
||||
matches. While describing the functions we will see that the opposite
|
||||
case is useful as well. I.e., there may be entries which will not
|
||||
match any input. For entries like a name consisting of the single
|
||||
match any input. For entries like this, a name consisting of the single
|
||||
character @code{-} shall be used.
|
||||
|
||||
@node Lookup Netgroup
|
||||
@ -1889,10 +1889,10 @@ These functions are declared in @file{netdb.h}.
|
||||
@comment BSD
|
||||
@deftypefun int setnetgrent (const char *@var{netgroup})
|
||||
A call to this function initializes the internal state of the library to
|
||||
allow following calls of the @code{getnetgrent} iterate over all entries
|
||||
allow following calls of the @code{getnetgrent} to iterate over all entries
|
||||
in the netgroup with name @var{netgroup}.
|
||||
|
||||
When the call is successful (i.e., when a netgroup with this name exist)
|
||||
When the call is successful (i.e., when a netgroup with this name exists)
|
||||
the return value is @code{1}. When the return value is @code{0} no
|
||||
netgroup of this name is known or some other error occurred.
|
||||
@end deftypefun
|
||||
@ -1914,11 +1914,11 @@ the @code{innetgr} function and parts of the implementation of the
|
||||
@comment BSD
|
||||
@deftypefun int getnetgrent (char **@var{hostp}, char **@var{userp}, char **@var{domainp})
|
||||
This function returns the next unprocessed entry of the currently
|
||||
selected netgroup. The string pointers, which addresses are passed in
|
||||
selected netgroup. The string pointers, in which addresses are passed in
|
||||
the arguments @var{hostp}, @var{userp}, and @var{domainp}, will contain
|
||||
after a successful call pointers to appropriate strings. If the string
|
||||
in the next entry is empty the pointer has the value @code{NULL}.
|
||||
The returned string pointers are only valid unless no of the netgroup
|
||||
The returned string pointers are only valid if none of the netgroup
|
||||
related functions are called.
|
||||
|
||||
The return value is @code{1} if the next entry was successfully read. A
|
||||
@ -1946,7 +1946,7 @@ SunOS libc does not provide this function.
|
||||
@comment netdb.h
|
||||
@comment BSD
|
||||
@deftypefun void endnetgrent (void)
|
||||
This function free all buffers which were allocated to process the last
|
||||
This function frees all buffers which were allocated to process the last
|
||||
selected netgroup. As a result all string pointers returned by calls
|
||||
to @code{getnetgrent} are invalid afterwards.
|
||||
@end deftypefun
|
||||
@ -1975,7 +1975,7 @@ to the other @code{set}/@code{get}/@code{endnetgrent} functions.
|
||||
@end enumerate
|
||||
|
||||
Any of the pointers @var{hostp}, @var{userp}, and @var{domainp} can be
|
||||
@code{NULL} which means any value is excepted in this position. This is
|
||||
@code{NULL} which means any value is accepted in this position. This is
|
||||
also true for the name @code{-} which should not match any other string
|
||||
otherwise.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user