This chapter describes facilities for controlling the system that underlies a process (including the operating system and hardware) and for getting information about it. Anyone can generally use the informational facilities, but usually only a properly privileged process can make changes.
To get information on parameters of the system that are built into the system, such as the maximum length of a filename, section System Configuration Parameters.
This section explains how to identify the particular system on which your program is running. First, let's review the various ways computer systems are named, which is a little complicated because of the history of the development of the Internet.
Every Unix system (also known as a host) has a host name, whether it's connected to a network or not. In its simplest form, as used before computer networks were an issue, it's just a word like `chicken'.
But any system attached to the Internet or any network like it conforms to a more rigorous naming convention as part of the Domain Name System (DNS). In DNS, every host name is composed of two parts:
You will note that "hostname" looks a lot like "host name", but is not the same thing, and that people often incorrectly refer to entire host names as "domain names."
In DNS, the full host name is properly called the FQDN (Fully Qualified Domain Name) and consists of the hostname, then a period, then the domain name. The domain name itself usually has multiple components separated by periods. So for example, a system's hostname may be `chicken' and its domain name might be `ai.mit.edu', so its FQDN (which is its host name) is `chicken.ai.mit.edu'.
Adding to the confusion, though, is that DNS is not the only name space in which a computer needs to be known. Another name space is the NIS (aka YP) name space. For NIS purposes, there is another domain name, which is called the NIS domain name or the YP domain name. It need not have anything to do with the DNS domain name.
Confusing things even more is the fact that in DNS, it is possible for multiple FQDNs to refer to the same system. However, there is always exactly one of them that is the true host name, and it is called the canonical FQDN.
In some contexts, the host name is called a "node name."
For more information on DNS host naming, See section Host Names.
Prototypes for these functions appear in `unistd.h'.
The programs hostname
, hostid
, and domainname
work
by calling these functions.
The return value is 0
on success and -1
on failure. In
the GNU C library, gethostname
fails if size is not large
enough; then you can try again with a larger array. The following
errno
error condition is defined for this function:
ENAMETOOLONG
On some systems, there is a symbol for the maximum possible host name
length: MAXHOSTNAMELEN
. It is defined in `sys/param.h'.
But you can't count on this to exist, so it is cleaner to handle
failure and try again.
gethostname
stores the beginning of the host name in name
even if the host name won't entirely fit. For some purposes, a
truncated host name is good enough. If it is, you can ignore the
error code.
sethostname
function sets the host name of the system that
calls it to name, a string with length length. Only
privileged processes are permitted to do this.
Usually sethostname
gets called just once, at system boot time.
Often, the program that calls it sets it to the value it finds in the
file /etc/hostname
.
Be sure to set the host name to the full host name, not just the DNS hostname (see above).
The return value is 0
on success and -1
on failure.
The following errno
error condition is defined for this function:
EPERM
getdomainname
returns the NIS (aka YP) domain name of the system
on which it is called. Note that this is not the more popular DNS
domain name. Get that with gethostname
.
The specifics of this function are analogous to gethostname
, above.
getdomainname
sets the NIS (aka YP) domain name of the system
on which it is called. Note that this is not the more popular DNS
domain name. Set that with sethostname
.
The specifics of this function are analogous to sethostname
, above.
long int
. However, on some
systems it is a meaningless but unique number which is hard-coded for
each machine.
This is not widely used. It arose in BSD 4.2, but was dropped in BSD 4.4. It is not required by POSIX.
The proper way to query the IP address is to use gethostbyname
on the results of gethostname
. For more information on IP addresses,
See section Host Addresses.
sethostid
function sets the "host ID" of the host machine
to id. Only privileged processes are permitted to do this. Usually
it happens just once, at system boot time.
The proper way to establish the primary IP address of a system
is to configure the IP address resolver to associate that IP address with
the system's host name as returned by gethostname
. For example,
put a record for the system in `/etc/hosts'.
See gethostid
above for more information on host ids.
The return value is 0
on success and -1
on failure.
The following errno
error conditions are defined for this function:
EPERM
ENOSYS
You can use the uname
function to find out some information about
the type of computer your program is running on. This function and the
associated data type are declared in the header file
`sys/utsname.h'.
As a bonus, uname
also gives some information identifying the
particular system your program is running on. This is the same information
which you can get with functions targetted to this purpose described in
section Host Identification.
utsname
structure is used to hold information returned
by the uname
function. It has the following members:
char sysname[]
char release[]
char version[]
char machine[]
machine
is supposed to describe just the
hardware, it consists of the first two parts of the configuration name:
`cpu-manufacturer'. For example, it might be one of these:
"sparc-sun"
,"i386-anything"
,"m68k-hp"
,"m68k-sony"
,"m68k-sun"
,"mips-dec"
char nodename[]
gethostname
;
see section Host Identification.
gethostname() is implemented with a call to uname().
char domainname[]
getdomainname
; see section Host Identification. This element
is a relatively recent invention and use of it is not as portable as
use of the rest of the structure.
uname
function fills in the structure pointed to by
info with information about the operating system and host machine.
A non-negative value indicates that the data was successfully stored.
-1
as the value indicates an error. The only error possible is
EFAULT
, which we normally don't mention as it is always a
possibility.
All files are in filesystems, and before you can access any file, its filesystem must be mounted. Because of Unix's concept of Everything is a file, mounting of filesystems is central to doing almost anything. This section explains how to find out what filesystems are currently mounted and what filesystems are available for mounting, and how to change what is mounted.
The classic filesystem is the contents of a disk drive. The concept is considerably more abstract, though, and lots of things other than disk drives can be mounted.
Some block devices don't correspond to traditional devices like disk drives. For example, a loop device is a block device whose driver uses a regular file in another filesystem as its medium. So if that regular file contains appropriate data for a filesystem, you can by mounting the loop device essentially mount a regular file.
Some filesystems aren't based on a device of any kind. The "proc" filesystem, for example, contains files whose data is made up by the filesystem driver on the fly whenever you ask for it. And when you write to it, the data you write causes changes in the system. No data gets stored.
For some programs it is desirable and necessary to access 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 `/etc/fstab' which
describes all possibly mounted filesystems. The mount
program
uses this file to mount at startup time of the system all the necessary
filesystems. The information about all the filesystems actually mounted
is normally kept in a file named `/etc/mtab'. Both files share
the same syntax and it is crucial that this syntax is followed all the
time. Therefore it is best to never directly write the files. The
functions described in this section can do this and they also provide
the functionality to convert the external textual representation to the
internal representation.
Note that the `fstab' and `mtab' files are maintained on a system by convention. It is possible for the files not to exist or not to be consistent with what is really mounted or available to mount, if the system's administration policy allows it. But programs that mount and unmount filesystems typically maintain and use these files as described herein.
The filenames given above should never be used directly. The portable
way to handle these file is to use the macros _PATH_FSTAB
,
defined in `fstab.h' and _PATH_MNTTAB
, defined in
`mntent.h', respectively. There are also two alternate macro names
FSTAB
and _PATH_MOUNTED
defined but both names are
deprecated and kept only for backward compatibility. The two former
names should always be used.
The internal representation for entries of the file is struct
fstab
, defined in `fstab.h'.
getfsent
, getfsspec
, and
getfsfile
functions.
char *fs_spec
const
it shouldn't be
modified. The missing const
has historic reasons, since this
function predates ISO C. The same is true for the other string
elements of this structure.
char *fs_file
char *fs_vfstype
char *fs_mntops
mount
call. Again, this can be almost anything. There can be
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 =
character.
If the value of this element must be processed it should ideally be done
using the getsubopt
function; see section Parsing of Suboptions.
const char *fs_type
fs_mntops
string) which describes the modes with which the
filesystem is mounted. `fstab' defines five macros to describe the
possible values:
FSTAB_RW
FSTAB_RQ
FSTAB_RO
FSTAB_SW
FSTAB_XX
strcmp
since these are all strings. Comparing the pointer will probably always
fail.
int fs_freq
int fs_passno
dump
utility used on Unix systems.
To read the entire content of the of the `fstab' file the GNU libc contains a set of three functions which are designed in the usual way.
Since the file handle is internal to the libc this function is not thread-safe.
This function returns a non-zero value if the operation was successful
and the getfs*
functions can be used to read the entries of the
file.
setfsent
(explicitly or implicitly by calling getfsent
) are
freed.
endfsent
, the file will be
opened.
The function returns a pointer to a variable of type struct
fstab
. This variable is shared by all threads and therefore this
function is not thread-safe. If an error occurred getfsent
returns a NULL
pointer.
fs_spec
element.
Since there is normally exactly one entry for each special device it
makes no sense to call this function more than once for the same
argument. If this is the first call to any of the functions handling
`fstab' since program start or the last call of endfsent
,
the file will be opened.
The function returns a pointer to a variable of type struct
fstab
. This variable is shared by all threads and therefore this
function is not thread-safe. If an error occurred getfsent
returns a NULL
pointer.
fs_file
element.
Since there is normally exactly one entry for each mount point it
makes no sense to call this function more than once for the same
argument. If this is the first call to any of the functions handling
`fstab' since program start or the last call of endfsent
,
the file will be opened.
The function returns a pointer to a variable of type struct
fstab
. This variable is shared by all threads and therefore this
function is not thread-safe. If an error occurred getfsent
returns a NULL
pointer.
The following functions and data structure access the `mtab' file.
getmntent
, getmntent_t
,
addmntent
, and hasmntopt
functions.
char *mnt_fsname
fs_spec
element in struct fstab
.
char *mnt_dir
fs_file
element in
struct fstab
.
char *mnt_type
mnt_type
describes the filesystem type and is therefore
equivalent to fs_vfstype
in struct fstab
. `mntent.h'
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 symbols provided in `mntent.h'.
MNTTYPE_IGNORE
"ignore"
. The value is sometime used in
`fstab' files to make sure entries are not used without removing them.
MNTTYPE_NFS
"nfs"
. Using this macro sometimes could make sense
since it names the default NFS implementation, in case both version 2
and 3 are supported.
MNTTYPE_SWAP
"swap"
. It names the special `fstab'
entry which names one of the possibly multiple swap partitions.
char *mnt_opts
fs_mntops
of
struct fstab
it is best to use the function getsubopt
(see section Parsing of Suboptions) to access the parts of this string.
The `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 doesn't make much sense
to rely on these macros but to be consistent here is the list:
MNTOPT_DEFAULTS
"defaults"
. This option should be used alone since it
indicates all values for the customizable values are chosen to be the
default.
MNTOPT_RO
"ro"
. See the FSTAB_RO
value, it means the
filesystem is mounted read-only.
MNTOPT_RW
"rw"
. See the FSTAB_RW
value, it means the
filesystem is mounted with read and write permissions.
MNTOPT_SUID
"suid"
. This means that the SUID bit (see section How an Application Can Change Persona) is respected when a program from the filesystem is
started.
MNTOPT_NOSUID
"nosuid"
. This is the opposite of MNTOPT_SUID
,
the SUID bit for all files from the filesystem is ignored.
MNTOPT_NOAUTO
"noauto"
. At startup time the mount
program
will ignore this entry if it is started with the -a
option to
mount all filesystems mentioned in the `fstab' file.
FSTAB_*
entries introduced above it is important to
use strcmp
to check for equality.
mnt_freq
fs_freq
and also specifies the
frequency in days in which dumps are made.
mnt_passno
fs_passno
with the same meaning
which is uninteresting for all programs beside dump
.
For accessing the `mtab' file there is again a set of three functions to access all entries in a row. Unlike the functions to handle `fstab' these functions do not access a fixed file and there is even a thread safe variant of the get function. Beside this the GNU libc contains functions to alter the file and test for specific options.
setmntent
function prepares the file named FILE which
must be in the format of a `fstab' and `mtab' file for the
upcoming processing through the other functions of the family. The
mode parameter can be chosen in the way the opentype
parameter for fopen
(see section Opening Streams) can be chosen. If
the file is opened for writing the file is also allowed to be empty.
If the file was successfully opened setmntent
returns a file
descriptor for future use. Otherwise the return value is NULL
and errno
is set accordingly.
setmntent
call.
endmntent
closes the stream and frees all resources.
The return value is @math{1} unless an error occurred in which case it is @math{0}.
getmntent
function takes as the parameter a file handle
previously returned by successful call to setmntent
. It returns
a pointer to a static variable of type struct mntent
which is
filled with the information from the next entry from the file currently
read.
The file format used prescribes the use of spaces or tab characters to
separate the fields. This makes it harder to use name containing one of
these characters (e.g., mount points using spaces). Therefore these
characters are encoded in the files and the getmntent
function
takes care of the decoding while reading the entries back in.
'\040'
is used to encode a space character, '\012'
to
encode a tab character and '\\'
to encode a backslash.
If there was an error or the end of the file is reached the return value
is NULL
.
This function is not thread-safe since all calls to this function return
a pointer to the same static variable. getmntent_r
should be
used in situations where multiple threads access the file.
getmntent_r
function is the reentrant variant of
getmntent
. It also returns the next entry from the file and
returns a pointer. The actual variable the values are stored in is not
static, though. Instead the function stores the values in the variable
pointed to by the result parameter. Additional information (e.g.,
the strings pointed to by the elements of the result) are kept in the
buffer of size bufsize pointed to by buffer.
Escaped characters (space, tab, backslash) are converted back in the
same way as it happens for getmentent
.
The function returns a NULL
pointer in error cases. Errors could be:
addmntent
function allows adding a new entry to the file
previously opened with 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
following the current position.
The implication of this is that to remove an entry from a file one has to create a new file while leaving out the entry to be removed and after closing the file remove the old one and rename the new file to the chosen name.
This function takes care of spaces and tab characters in the names to be
written to the file. It converts them and the backslash character into
the format describe in the getmntent
description above.
This function returns @math{0} in case the operation was successful.
Otherwise the return value is @math{1} and errno
is set
appropriately.
mnt_opts
element of the variable pointed to by mnt contains
the option opt. If this is true a pointer to the beginning of the
option in the mnt_opts
element is returned. If no such option
exists the function returns NULL
.
This function is useful to test whether a specific option is present but
when all options have to be processed one is better off with using the
getsubopt
function to iterate over all options in the string.
On a system with a Linux kernel and the proc
filesystem, you can
get information on currently mounted filesystems from the file
`mounts' in the proc
filesystem. Its format is similar to
that of the `mtab' file, but represents what is truly mounted
without relying on facilities outside the kernel to keep `mtab' up
to date.
This section describes the functions for mounting, unmounting, and remounting filesystems.
Only the superuser can mount, unmount, or remount a filesystem.
These functions do not access the `fstab' and `mtab' files. You should maintain and use these separately. See section Mount Information.
The symbols in this section are declared in `sys/mount.h'.
mount
mounts or remounts a filesystem. The two operations are
quite different and are merged rather unnnaturally into this one function.
The MS_REMOUNT
option, explained below, determines whether
mount
mounts or remounts.
For a mount, the filesystem on the block device represented by the device special file named special_file gets mounted over the mount point dir. This means that the directory dir (along with any files in it) is no longer visible; in its place (and still with the name dir) is the root directory of the filesystem on the device.
As an exception, if the filesystem type (see below) is one which is not
based on a device (e.g. "proc"), mount
instantiates a
filesystem and mounts it over dir and ignores special_file.
For a remount, dir specifies the mount point where the filesystem to be remounted is (and remains) mounted and special_file is ignored. Remounting a filesystem means changing the options that control operations on the filesystem while it is mounted. It does not mean unmounting and mounting again.
For a mount, you must identify the type of the filesystem as
fstype. This type tells the kernel how to access the filesystem
and can be thought of as the name of a filesystem driver. The
acceptable values are system dependent. On a system with a Linux kernel
and the proc
filesystem, the list of possible values is in the
file `filesystems' in the proc
filesystem (e.g. type
cat /proc/filesystems to see the list). With a Linux kernel, the
types of filesystems that mount
can mount, and their type names,
depends on what filesystem drivers are configured into the kernel or
loaded as loadable kernel modules. An example of a common value for
fstype is ext2
.
For a remount, mount
ignores fstype.
options specifies a variety of options that apply until the
filesystem is unmounted or remounted. The precise meaning of an option
depends on the filesystem and with some filesystems, an option may have
no effect at all. Furthermore, for some filesystems, some of these
options (but never MS_RDONLY
) can be overridden for individual
file accesses via ioctl
.
options is a bit string with bit fields defined using the following mask and masked value macros:
MS_MGC_MASK
MS_MGC_VAL
, mount
assumes all the following bits are zero and
the data argument is a null string, regardless of their actual values.
MS_REMOUNT
MS_RDONLY
ioctl
. This
option is available on nearly all filesystems.
S_IMMUTABLE
ioctl
.
This option is a relatively new invention and is not available on many
filesystems.
S_APPEND
ioctl
. This is a relatively new invention and is not
available on many filesystems.
MS_NOSUID
MS_NOEXEC
MS_NODEV
MS_SYNCHRONOUS
MS_MANDLOCK
MS_NOATIME
MS_NODIRATIME
Any bits not covered by the above masks should be set off; otherwise, results are undefined.
The meaning of data depends on the filesystem type and is controlled entirely by the filesystem driver in the kernel.
Example:
#include <sys/mount.h> mount("/dev/hdb", "/cdrom", MS_MGC_VAL | MS_RDONLY | MS_NOSUID, ""); mount("/dev/hda2", "/mnt", MS_MGC_VAL | MS_REMOUNT, "");
Appropriate arguments for mount
are conventionally recorded in
the `fstab' table. See section Mount Information.
The return value is zero if the mount or remount is successful. Otherwise,
it is -1
and errno
is set appropriately. The values of
errno
are filesystem dependent, but here is a general list:
EPERM
ENODEV
ENOTBLK
EBUSY
EINVAL
EACCESS
MS_RDONLY
bit off).
MS_NODEV
option.
EM_FILE
mount
needs to create a
dummy device (aka "unnamed" device) if the filesystem being mounted is
not one that uses a device.
umount2
unmounts a filesystem.
You can identify the filesystem to unmount either by the device special file that contains the filesystem or by the mount point. The effect is the same. Specify either as the string file.
flags contains the one-bit field identified by the following mask macro:
MNT_FORCE
umount2
fails with errno
= EBUSY
. Depending
on the filesystem, this may override all, some, or no busy conditions.
All other bits in flags should be set to zero; otherwise, the result is undefined.
Example:
#include <sys/mount.h> umount2("/mnt", MNT_FORCE); umount2("/dev/hdd1", 0);
After the filesystem is unmounted, the directory that was the mount point is visible, as are any files in it.
As part of unmounting, umount2
syncs the filesystem.
If the unmounting is successful, the return value is zero. Otherwise, it
is -1
and errno
is set accordingly:
EPERM
EBUSY
MNT_FORCE
option.
EINVAL
This function is not available on all systems.
umount
does the same thing as umount2
with flags set
to zeroes. It is more widely available than umount2
but since it
lacks the possibility to forcefully unmount a filesystem is deprecated
when umount2
is also available.
This section describes the sysctl
function, which gets and sets
a variety of system parameters.
The symbols used in this section are declared in the file `sysctl.h'.
sysctl
gets or sets a specified system parameter. There are so
many of these parameters that it is not practical to list them all here,
but here are some examples:
The set of available parameters depends on the kernel configuration and can change while the system is running, particularly when you load and unload loadable kernel modules.
The system parameters with which syslog
is concerned are arranged
in a hierarchical structure like a hierarchical filesystem. To identify
a particular parameter, you specify a path through the structure in a
way analogous to specifying the pathname of a file. Each component of
the path is specified by an integer and each of these integers has a
macro defined for it by `sysctl.h'. names is the path, in
the form of an array of integers. Each component of the path is one
element of the array, in order. nlen is the number of components
in the path.
For example, the first component of the path for all the paging
parameters is the value CTL_VM
. For the free page thresholds, the
second component of the path is VM_FREEPG
. So to get the free
page threshold values, make names an array containing the two
elements CTL_VM
and VM_FREEPG
and make nlen = 2.
The format of the value of a parameter depends on the parameter. Sometimes it is an integer; sometimes it is an ASCII string; sometimes it is an elaborate structure. In the case of the free page thresholds used in the example above, the parameter value is a structure containing several integers.
In any case, you identify a place to return the parameter's value with oldval and specify the amount of storage available at that location as *oldlenp. *oldlenp does double duty because it is also the output location that contains the actual length of the returned value.
If you don't want the parameter value returned, specify a null pointer for oldval.
To set the parameter, specify the address and length of the new value as newval and newlen. If you don't want to set the parameter, specify a null pointer as newval.
If you get and set a parameter in the same sysctl
call, the value
returned is the value of the parameter before it was set.
Each system parameter has a set of permissions similar to the permissions for a file (including the permissions on directories in its path) that determine whether you may get or set it. For the purposes of these permissions, every parameter is considered to be owned by the superuser and Group 0 so processes with that effective uid or gid may have more access to system parameters. Unlike with files, the superuser does not invariably have full permission to all system parameters, because some of them are designed not to be changed ever.
sysctl
returns a zero return value if it succeeds. Otherwise, it
returns -1
and sets errno
appropriately. Besides the
failures that apply to all system calls, the following are the
errno
codes for all possible failures:
EPERM
ENOTDIR
EFAULT
EINVAL
ENOMEM
EINVAL
in some
cases where the space provided for the return of the system parameter is too
small.
If you have a Linux kernel with the proc
filesystem, you can get
and set most of the same parameters by reading and writing to files in
the sys
directory of the proc
filesystem. In the sys
directory, the directory structure represents the hierarchical structure
of the parameters. E.g. you can display the free page thresholds with
cat /proc/sys/vm/freepages
Some more traditional and more widely available, though less general, GNU C library functions for getting and setting some of the same system parameters are:
getdomainname
, setdomainname
gethostname
, sethostname
(See section Host Identification.)
uname
(See section Platform Type Identification.)
bdflush
Go to the first, previous, next, last section, table of contents.