ls1x-loongson-gnu-toolchain.../sysroot/usr/share/info/libc.info-6
2024-11-27 15:46:37 +08:00

7048 lines
282 KiB
Plaintext
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This is libc.info, produced by makeinfo version 6.5 from libc.texinfo.
This file documents the GNU C Library.
This is The GNU C Library Reference Manual, for version 2.28.
Copyright © 19932018 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being “Free Software Needs Free Documentation” and
“GNU Lesser General Public License”, the Front-Cover texts being “A GNU
Manual”, and with the Back-Cover Texts as in (a) below. A copy of the
license is included in the section entitled "GNU Free Documentation
License".
(a) The FSFs Back-Cover Text is: “You have the freedom to copy and
modify this GNU manual. Buying copies from the FSF supports it in
developing GNU and promoting software freedom.”
INFO-DIR-SECTION Software libraries
START-INFO-DIR-ENTRY
* Libc: (libc). C library.
END-INFO-DIR-ENTRY
INFO-DIR-SECTION GNU C library functions and macros
START-INFO-DIR-ENTRY
* ALTWERASE: (libc)Local Modes.
* ARGP_ERR_UNKNOWN: (libc)Argp Parser Functions.
* ARG_MAX: (libc)General Limits.
* BC_BASE_MAX: (libc)Utility Limits.
* BC_DIM_MAX: (libc)Utility Limits.
* BC_SCALE_MAX: (libc)Utility Limits.
* BC_STRING_MAX: (libc)Utility Limits.
* BRKINT: (libc)Input Modes.
* BUFSIZ: (libc)Controlling Buffering.
* CCTS_OFLOW: (libc)Control Modes.
* CHAR_BIT: (libc)Width of Type.
* CHILD_MAX: (libc)General Limits.
* CIGNORE: (libc)Control Modes.
* CLK_TCK: (libc)Processor Time.
* CLOCAL: (libc)Control Modes.
* CLOCKS_PER_SEC: (libc)CPU Time.
* COLL_WEIGHTS_MAX: (libc)Utility Limits.
* CPU_CLR: (libc)CPU Affinity.
* CPU_ISSET: (libc)CPU Affinity.
* CPU_SET: (libc)CPU Affinity.
* CPU_SETSIZE: (libc)CPU Affinity.
* CPU_ZERO: (libc)CPU Affinity.
* CREAD: (libc)Control Modes.
* CRTS_IFLOW: (libc)Control Modes.
* CS5: (libc)Control Modes.
* CS6: (libc)Control Modes.
* CS7: (libc)Control Modes.
* CS8: (libc)Control Modes.
* CSIZE: (libc)Control Modes.
* CSTOPB: (libc)Control Modes.
* DTTOIF: (libc)Directory Entries.
* E2BIG: (libc)Error Codes.
* EACCES: (libc)Error Codes.
* EADDRINUSE: (libc)Error Codes.
* EADDRNOTAVAIL: (libc)Error Codes.
* EADV: (libc)Error Codes.
* EAFNOSUPPORT: (libc)Error Codes.
* EAGAIN: (libc)Error Codes.
* EALREADY: (libc)Error Codes.
* EAUTH: (libc)Error Codes.
* EBACKGROUND: (libc)Error Codes.
* EBADE: (libc)Error Codes.
* EBADF: (libc)Error Codes.
* EBADFD: (libc)Error Codes.
* EBADMSG: (libc)Error Codes.
* EBADR: (libc)Error Codes.
* EBADRPC: (libc)Error Codes.
* EBADRQC: (libc)Error Codes.
* EBADSLT: (libc)Error Codes.
* EBFONT: (libc)Error Codes.
* EBUSY: (libc)Error Codes.
* ECANCELED: (libc)Error Codes.
* ECHILD: (libc)Error Codes.
* ECHO: (libc)Local Modes.
* ECHOCTL: (libc)Local Modes.
* ECHOE: (libc)Local Modes.
* ECHOK: (libc)Local Modes.
* ECHOKE: (libc)Local Modes.
* ECHONL: (libc)Local Modes.
* ECHOPRT: (libc)Local Modes.
* ECHRNG: (libc)Error Codes.
* ECOMM: (libc)Error Codes.
* ECONNABORTED: (libc)Error Codes.
* ECONNREFUSED: (libc)Error Codes.
* ECONNRESET: (libc)Error Codes.
* ED: (libc)Error Codes.
* EDEADLK: (libc)Error Codes.
* EDEADLOCK: (libc)Error Codes.
* EDESTADDRREQ: (libc)Error Codes.
* EDIED: (libc)Error Codes.
* EDOM: (libc)Error Codes.
* EDOTDOT: (libc)Error Codes.
* EDQUOT: (libc)Error Codes.
* EEXIST: (libc)Error Codes.
* EFAULT: (libc)Error Codes.
* EFBIG: (libc)Error Codes.
* EFTYPE: (libc)Error Codes.
* EGRATUITOUS: (libc)Error Codes.
* EGREGIOUS: (libc)Error Codes.
* EHOSTDOWN: (libc)Error Codes.
* EHOSTUNREACH: (libc)Error Codes.
* EHWPOISON: (libc)Error Codes.
* EIDRM: (libc)Error Codes.
* EIEIO: (libc)Error Codes.
* EILSEQ: (libc)Error Codes.
* EINPROGRESS: (libc)Error Codes.
* EINTR: (libc)Error Codes.
* EINVAL: (libc)Error Codes.
* EIO: (libc)Error Codes.
* EISCONN: (libc)Error Codes.
* EISDIR: (libc)Error Codes.
* EISNAM: (libc)Error Codes.
* EKEYEXPIRED: (libc)Error Codes.
* EKEYREJECTED: (libc)Error Codes.
* EKEYREVOKED: (libc)Error Codes.
* EL2HLT: (libc)Error Codes.
* EL2NSYNC: (libc)Error Codes.
* EL3HLT: (libc)Error Codes.
* EL3RST: (libc)Error Codes.
* ELIBACC: (libc)Error Codes.
* ELIBBAD: (libc)Error Codes.
* ELIBEXEC: (libc)Error Codes.
* ELIBMAX: (libc)Error Codes.
* ELIBSCN: (libc)Error Codes.
* ELNRNG: (libc)Error Codes.
* ELOOP: (libc)Error Codes.
* EMEDIUMTYPE: (libc)Error Codes.
* EMFILE: (libc)Error Codes.
* EMLINK: (libc)Error Codes.
* EMSGSIZE: (libc)Error Codes.
* EMULTIHOP: (libc)Error Codes.
* ENAMETOOLONG: (libc)Error Codes.
* ENAVAIL: (libc)Error Codes.
* ENEEDAUTH: (libc)Error Codes.
* ENETDOWN: (libc)Error Codes.
* ENETRESET: (libc)Error Codes.
* ENETUNREACH: (libc)Error Codes.
* ENFILE: (libc)Error Codes.
* ENOANO: (libc)Error Codes.
* ENOBUFS: (libc)Error Codes.
* ENOCSI: (libc)Error Codes.
* ENODATA: (libc)Error Codes.
* ENODEV: (libc)Error Codes.
* ENOENT: (libc)Error Codes.
* ENOEXEC: (libc)Error Codes.
* ENOKEY: (libc)Error Codes.
* ENOLCK: (libc)Error Codes.
* ENOLINK: (libc)Error Codes.
* ENOMEDIUM: (libc)Error Codes.
* ENOMEM: (libc)Error Codes.
* ENOMSG: (libc)Error Codes.
* ENONET: (libc)Error Codes.
* ENOPKG: (libc)Error Codes.
* ENOPROTOOPT: (libc)Error Codes.
* ENOSPC: (libc)Error Codes.
* ENOSR: (libc)Error Codes.
* ENOSTR: (libc)Error Codes.
* ENOSYS: (libc)Error Codes.
* ENOTBLK: (libc)Error Codes.
* ENOTCONN: (libc)Error Codes.
* ENOTDIR: (libc)Error Codes.
* ENOTEMPTY: (libc)Error Codes.
* ENOTNAM: (libc)Error Codes.
* ENOTRECOVERABLE: (libc)Error Codes.
* ENOTSOCK: (libc)Error Codes.
* ENOTSUP: (libc)Error Codes.
* ENOTTY: (libc)Error Codes.
* ENOTUNIQ: (libc)Error Codes.
* ENXIO: (libc)Error Codes.
* EOF: (libc)EOF and Errors.
* EOPNOTSUPP: (libc)Error Codes.
* EOVERFLOW: (libc)Error Codes.
* EOWNERDEAD: (libc)Error Codes.
* EPERM: (libc)Error Codes.
* EPFNOSUPPORT: (libc)Error Codes.
* EPIPE: (libc)Error Codes.
* EPROCLIM: (libc)Error Codes.
* EPROCUNAVAIL: (libc)Error Codes.
* EPROGMISMATCH: (libc)Error Codes.
* EPROGUNAVAIL: (libc)Error Codes.
* EPROTO: (libc)Error Codes.
* EPROTONOSUPPORT: (libc)Error Codes.
* EPROTOTYPE: (libc)Error Codes.
* EQUIV_CLASS_MAX: (libc)Utility Limits.
* ERANGE: (libc)Error Codes.
* EREMCHG: (libc)Error Codes.
* EREMOTE: (libc)Error Codes.
* EREMOTEIO: (libc)Error Codes.
* ERESTART: (libc)Error Codes.
* ERFKILL: (libc)Error Codes.
* EROFS: (libc)Error Codes.
* ERPCMISMATCH: (libc)Error Codes.
* ESHUTDOWN: (libc)Error Codes.
* ESOCKTNOSUPPORT: (libc)Error Codes.
* ESPIPE: (libc)Error Codes.
* ESRCH: (libc)Error Codes.
* ESRMNT: (libc)Error Codes.
* ESTALE: (libc)Error Codes.
* ESTRPIPE: (libc)Error Codes.
* ETIME: (libc)Error Codes.
* ETIMEDOUT: (libc)Error Codes.
* ETOOMANYREFS: (libc)Error Codes.
* ETXTBSY: (libc)Error Codes.
* EUCLEAN: (libc)Error Codes.
* EUNATCH: (libc)Error Codes.
* EUSERS: (libc)Error Codes.
* EWOULDBLOCK: (libc)Error Codes.
* EXDEV: (libc)Error Codes.
* EXFULL: (libc)Error Codes.
* EXIT_FAILURE: (libc)Exit Status.
* EXIT_SUCCESS: (libc)Exit Status.
* EXPR_NEST_MAX: (libc)Utility Limits.
* FD_CLOEXEC: (libc)Descriptor Flags.
* FD_CLR: (libc)Waiting for I/O.
* FD_ISSET: (libc)Waiting for I/O.
* FD_SET: (libc)Waiting for I/O.
* FD_SETSIZE: (libc)Waiting for I/O.
* FD_ZERO: (libc)Waiting for I/O.
* FE_SNANS_ALWAYS_SIGNAL: (libc)Infinity and NaN.
* FILENAME_MAX: (libc)Limits for Files.
* FLUSHO: (libc)Local Modes.
* FOPEN_MAX: (libc)Opening Streams.
* FP_ILOGB0: (libc)Exponents and Logarithms.
* FP_ILOGBNAN: (libc)Exponents and Logarithms.
* FP_LLOGB0: (libc)Exponents and Logarithms.
* FP_LLOGBNAN: (libc)Exponents and Logarithms.
* F_DUPFD: (libc)Duplicating Descriptors.
* F_GETFD: (libc)Descriptor Flags.
* F_GETFL: (libc)Getting File Status Flags.
* F_GETLK: (libc)File Locks.
* F_GETOWN: (libc)Interrupt Input.
* F_OFD_GETLK: (libc)Open File Description Locks.
* F_OFD_SETLK: (libc)Open File Description Locks.
* F_OFD_SETLKW: (libc)Open File Description Locks.
* F_OK: (libc)Testing File Access.
* F_SETFD: (libc)Descriptor Flags.
* F_SETFL: (libc)Getting File Status Flags.
* F_SETLK: (libc)File Locks.
* F_SETLKW: (libc)File Locks.
* F_SETOWN: (libc)Interrupt Input.
* HUGE_VAL: (libc)Math Error Reporting.
* HUGE_VALF: (libc)Math Error Reporting.
* HUGE_VALL: (libc)Math Error Reporting.
* HUGE_VAL_FN: (libc)Math Error Reporting.
* HUGE_VAL_FNx: (libc)Math Error Reporting.
* HUPCL: (libc)Control Modes.
* I: (libc)Complex Numbers.
* ICANON: (libc)Local Modes.
* ICRNL: (libc)Input Modes.
* IEXTEN: (libc)Local Modes.
* IFNAMSIZ: (libc)Interface Naming.
* IFTODT: (libc)Directory Entries.
* IGNBRK: (libc)Input Modes.
* IGNCR: (libc)Input Modes.
* IGNPAR: (libc)Input Modes.
* IMAXBEL: (libc)Input Modes.
* INADDR_ANY: (libc)Host Address Data Type.
* INADDR_BROADCAST: (libc)Host Address Data Type.
* INADDR_LOOPBACK: (libc)Host Address Data Type.
* INADDR_NONE: (libc)Host Address Data Type.
* INFINITY: (libc)Infinity and NaN.
* INLCR: (libc)Input Modes.
* INPCK: (libc)Input Modes.
* IPPORT_RESERVED: (libc)Ports.
* IPPORT_USERRESERVED: (libc)Ports.
* ISIG: (libc)Local Modes.
* ISTRIP: (libc)Input Modes.
* IXANY: (libc)Input Modes.
* IXOFF: (libc)Input Modes.
* IXON: (libc)Input Modes.
* LINE_MAX: (libc)Utility Limits.
* LINK_MAX: (libc)Limits for Files.
* L_ctermid: (libc)Identifying the Terminal.
* L_cuserid: (libc)Who Logged In.
* L_tmpnam: (libc)Temporary Files.
* MAXNAMLEN: (libc)Limits for Files.
* MAXSYMLINKS: (libc)Symbolic Links.
* MAX_CANON: (libc)Limits for Files.
* MAX_INPUT: (libc)Limits for Files.
* MB_CUR_MAX: (libc)Selecting the Conversion.
* MB_LEN_MAX: (libc)Selecting the Conversion.
* MDMBUF: (libc)Control Modes.
* MSG_DONTROUTE: (libc)Socket Data Options.
* MSG_OOB: (libc)Socket Data Options.
* MSG_PEEK: (libc)Socket Data Options.
* NAME_MAX: (libc)Limits for Files.
* NAN: (libc)Infinity and NaN.
* NCCS: (libc)Mode Data Types.
* NGROUPS_MAX: (libc)General Limits.
* NOFLSH: (libc)Local Modes.
* NOKERNINFO: (libc)Local Modes.
* NSIG: (libc)Standard Signals.
* NULL: (libc)Null Pointer Constant.
* ONLCR: (libc)Output Modes.
* ONOEOT: (libc)Output Modes.
* OPEN_MAX: (libc)General Limits.
* OPOST: (libc)Output Modes.
* OXTABS: (libc)Output Modes.
* O_ACCMODE: (libc)Access Modes.
* O_APPEND: (libc)Operating Modes.
* O_ASYNC: (libc)Operating Modes.
* O_CREAT: (libc)Open-time Flags.
* O_EXCL: (libc)Open-time Flags.
* O_EXEC: (libc)Access Modes.
* O_EXLOCK: (libc)Open-time Flags.
* O_FSYNC: (libc)Operating Modes.
* O_IGNORE_CTTY: (libc)Open-time Flags.
* O_NDELAY: (libc)Operating Modes.
* O_NOATIME: (libc)Operating Modes.
* O_NOCTTY: (libc)Open-time Flags.
* O_NOLINK: (libc)Open-time Flags.
* O_NONBLOCK: (libc)Open-time Flags.
* O_NONBLOCK: (libc)Operating Modes.
* O_NOTRANS: (libc)Open-time Flags.
* O_RDONLY: (libc)Access Modes.
* O_RDWR: (libc)Access Modes.
* O_READ: (libc)Access Modes.
* O_SHLOCK: (libc)Open-time Flags.
* O_SYNC: (libc)Operating Modes.
* O_TMPFILE: (libc)Open-time Flags.
* O_TRUNC: (libc)Open-time Flags.
* O_WRITE: (libc)Access Modes.
* O_WRONLY: (libc)Access Modes.
* PARENB: (libc)Control Modes.
* PARMRK: (libc)Input Modes.
* PARODD: (libc)Control Modes.
* PATH_MAX: (libc)Limits for Files.
* PA_FLAG_MASK: (libc)Parsing a Template String.
* PENDIN: (libc)Local Modes.
* PF_FILE: (libc)Local Namespace Details.
* PF_INET6: (libc)Internet Namespace.
* PF_INET: (libc)Internet Namespace.
* PF_LOCAL: (libc)Local Namespace Details.
* PF_UNIX: (libc)Local Namespace Details.
* PIPE_BUF: (libc)Limits for Files.
* P_tmpdir: (libc)Temporary Files.
* RAND_MAX: (libc)ISO Random.
* RE_DUP_MAX: (libc)General Limits.
* RLIM_INFINITY: (libc)Limits on Resources.
* R_OK: (libc)Testing File Access.
* SA_NOCLDSTOP: (libc)Flags for Sigaction.
* SA_ONSTACK: (libc)Flags for Sigaction.
* SA_RESTART: (libc)Flags for Sigaction.
* SEEK_CUR: (libc)File Positioning.
* SEEK_END: (libc)File Positioning.
* SEEK_SET: (libc)File Positioning.
* SIGABRT: (libc)Program Error Signals.
* SIGALRM: (libc)Alarm Signals.
* SIGBUS: (libc)Program Error Signals.
* SIGCHLD: (libc)Job Control Signals.
* SIGCLD: (libc)Job Control Signals.
* SIGCONT: (libc)Job Control Signals.
* SIGEMT: (libc)Program Error Signals.
* SIGFPE: (libc)Program Error Signals.
* SIGHUP: (libc)Termination Signals.
* SIGILL: (libc)Program Error Signals.
* SIGINFO: (libc)Miscellaneous Signals.
* SIGINT: (libc)Termination Signals.
* SIGIO: (libc)Asynchronous I/O Signals.
* SIGIOT: (libc)Program Error Signals.
* SIGKILL: (libc)Termination Signals.
* SIGLOST: (libc)Operation Error Signals.
* SIGPIPE: (libc)Operation Error Signals.
* SIGPOLL: (libc)Asynchronous I/O Signals.
* SIGPROF: (libc)Alarm Signals.
* SIGQUIT: (libc)Termination Signals.
* SIGSEGV: (libc)Program Error Signals.
* SIGSTOP: (libc)Job Control Signals.
* SIGSYS: (libc)Program Error Signals.
* SIGTERM: (libc)Termination Signals.
* SIGTRAP: (libc)Program Error Signals.
* SIGTSTP: (libc)Job Control Signals.
* SIGTTIN: (libc)Job Control Signals.
* SIGTTOU: (libc)Job Control Signals.
* SIGURG: (libc)Asynchronous I/O Signals.
* SIGUSR1: (libc)Miscellaneous Signals.
* SIGUSR2: (libc)Miscellaneous Signals.
* SIGVTALRM: (libc)Alarm Signals.
* SIGWINCH: (libc)Miscellaneous Signals.
* SIGXCPU: (libc)Operation Error Signals.
* SIGXFSZ: (libc)Operation Error Signals.
* SIG_ERR: (libc)Basic Signal Handling.
* SNAN: (libc)Infinity and NaN.
* SNANF: (libc)Infinity and NaN.
* SNANFN: (libc)Infinity and NaN.
* SNANFNx: (libc)Infinity and NaN.
* SNANL: (libc)Infinity and NaN.
* SOCK_DGRAM: (libc)Communication Styles.
* SOCK_RAW: (libc)Communication Styles.
* SOCK_RDM: (libc)Communication Styles.
* SOCK_SEQPACKET: (libc)Communication Styles.
* SOCK_STREAM: (libc)Communication Styles.
* SOL_SOCKET: (libc)Socket-Level Options.
* SSIZE_MAX: (libc)General Limits.
* STREAM_MAX: (libc)General Limits.
* SUN_LEN: (libc)Local Namespace Details.
* S_IFMT: (libc)Testing File Type.
* S_ISBLK: (libc)Testing File Type.
* S_ISCHR: (libc)Testing File Type.
* S_ISDIR: (libc)Testing File Type.
* S_ISFIFO: (libc)Testing File Type.
* S_ISLNK: (libc)Testing File Type.
* S_ISREG: (libc)Testing File Type.
* S_ISSOCK: (libc)Testing File Type.
* S_TYPEISMQ: (libc)Testing File Type.
* S_TYPEISSEM: (libc)Testing File Type.
* S_TYPEISSHM: (libc)Testing File Type.
* TMP_MAX: (libc)Temporary Files.
* TOSTOP: (libc)Local Modes.
* TZNAME_MAX: (libc)General Limits.
* VDISCARD: (libc)Other Special.
* VDSUSP: (libc)Signal Characters.
* VEOF: (libc)Editing Characters.
* VEOL2: (libc)Editing Characters.
* VEOL: (libc)Editing Characters.
* VERASE: (libc)Editing Characters.
* VINTR: (libc)Signal Characters.
* VKILL: (libc)Editing Characters.
* VLNEXT: (libc)Other Special.
* VMIN: (libc)Noncanonical Input.
* VQUIT: (libc)Signal Characters.
* VREPRINT: (libc)Editing Characters.
* VSTART: (libc)Start/Stop Characters.
* VSTATUS: (libc)Other Special.
* VSTOP: (libc)Start/Stop Characters.
* VSUSP: (libc)Signal Characters.
* VTIME: (libc)Noncanonical Input.
* VWERASE: (libc)Editing Characters.
* WCHAR_MAX: (libc)Extended Char Intro.
* WCHAR_MIN: (libc)Extended Char Intro.
* WCOREDUMP: (libc)Process Completion Status.
* WEOF: (libc)EOF and Errors.
* WEOF: (libc)Extended Char Intro.
* WEXITSTATUS: (libc)Process Completion Status.
* WIFEXITED: (libc)Process Completion Status.
* WIFSIGNALED: (libc)Process Completion Status.
* WIFSTOPPED: (libc)Process Completion Status.
* WSTOPSIG: (libc)Process Completion Status.
* WTERMSIG: (libc)Process Completion Status.
* W_OK: (libc)Testing File Access.
* X_OK: (libc)Testing File Access.
* _Complex_I: (libc)Complex Numbers.
* _Exit: (libc)Termination Internals.
* _IOFBF: (libc)Controlling Buffering.
* _IOLBF: (libc)Controlling Buffering.
* _IONBF: (libc)Controlling Buffering.
* _Imaginary_I: (libc)Complex Numbers.
* _PATH_UTMP: (libc)Manipulating the Database.
* _PATH_WTMP: (libc)Manipulating the Database.
* _POSIX2_C_DEV: (libc)System Options.
* _POSIX2_C_VERSION: (libc)Version Supported.
* _POSIX2_FORT_DEV: (libc)System Options.
* _POSIX2_FORT_RUN: (libc)System Options.
* _POSIX2_LOCALEDEF: (libc)System Options.
* _POSIX2_SW_DEV: (libc)System Options.
* _POSIX_CHOWN_RESTRICTED: (libc)Options for Files.
* _POSIX_JOB_CONTROL: (libc)System Options.
* _POSIX_NO_TRUNC: (libc)Options for Files.
* _POSIX_SAVED_IDS: (libc)System Options.
* _POSIX_VDISABLE: (libc)Options for Files.
* _POSIX_VERSION: (libc)Version Supported.
* __fbufsize: (libc)Controlling Buffering.
* __flbf: (libc)Controlling Buffering.
* __fpending: (libc)Controlling Buffering.
* __fpurge: (libc)Flushing Buffers.
* __freadable: (libc)Opening Streams.
* __freading: (libc)Opening Streams.
* __fsetlocking: (libc)Streams and Threads.
* __fwritable: (libc)Opening Streams.
* __fwriting: (libc)Opening Streams.
* __gconv_end_fct: (libc)glibc iconv Implementation.
* __gconv_fct: (libc)glibc iconv Implementation.
* __gconv_init_fct: (libc)glibc iconv Implementation.
* __ppc_get_timebase: (libc)PowerPC.
* __ppc_get_timebase_freq: (libc)PowerPC.
* __ppc_mdoio: (libc)PowerPC.
* __ppc_mdoom: (libc)PowerPC.
* __ppc_set_ppr_low: (libc)PowerPC.
* __ppc_set_ppr_med: (libc)PowerPC.
* __ppc_set_ppr_med_high: (libc)PowerPC.
* __ppc_set_ppr_med_low: (libc)PowerPC.
* __ppc_set_ppr_very_low: (libc)PowerPC.
* __ppc_yield: (libc)PowerPC.
* __riscv_flush_icache: (libc)RISC-V.
* __va_copy: (libc)Argument Macros.
* _exit: (libc)Termination Internals.
* _flushlbf: (libc)Flushing Buffers.
* _tolower: (libc)Case Conversion.
* _toupper: (libc)Case Conversion.
* a64l: (libc)Encode Binary Data.
* abort: (libc)Aborting a Program.
* abs: (libc)Absolute Value.
* accept: (libc)Accepting Connections.
* access: (libc)Testing File Access.
* acos: (libc)Inverse Trig Functions.
* acosf: (libc)Inverse Trig Functions.
* acosfN: (libc)Inverse Trig Functions.
* acosfNx: (libc)Inverse Trig Functions.
* acosh: (libc)Hyperbolic Functions.
* acoshf: (libc)Hyperbolic Functions.
* acoshfN: (libc)Hyperbolic Functions.
* acoshfNx: (libc)Hyperbolic Functions.
* acoshl: (libc)Hyperbolic Functions.
* acosl: (libc)Inverse Trig Functions.
* addmntent: (libc)mtab.
* addseverity: (libc)Adding Severity Classes.
* adjtime: (libc)High-Resolution Calendar.
* adjtimex: (libc)High-Resolution Calendar.
* aio_cancel64: (libc)Cancel AIO Operations.
* aio_cancel: (libc)Cancel AIO Operations.
* aio_error64: (libc)Status of AIO Operations.
* aio_error: (libc)Status of AIO Operations.
* aio_fsync64: (libc)Synchronizing AIO Operations.
* aio_fsync: (libc)Synchronizing AIO Operations.
* aio_init: (libc)Configuration of AIO.
* aio_read64: (libc)Asynchronous Reads/Writes.
* aio_read: (libc)Asynchronous Reads/Writes.
* aio_return64: (libc)Status of AIO Operations.
* aio_return: (libc)Status of AIO Operations.
* aio_suspend64: (libc)Synchronizing AIO Operations.
* aio_suspend: (libc)Synchronizing AIO Operations.
* aio_write64: (libc)Asynchronous Reads/Writes.
* aio_write: (libc)Asynchronous Reads/Writes.
* alarm: (libc)Setting an Alarm.
* aligned_alloc: (libc)Aligned Memory Blocks.
* alloca: (libc)Variable Size Automatic.
* alphasort64: (libc)Scanning Directory Content.
* alphasort: (libc)Scanning Directory Content.
* argp_error: (libc)Argp Helper Functions.
* argp_failure: (libc)Argp Helper Functions.
* argp_help: (libc)Argp Help.
* argp_parse: (libc)Argp.
* argp_state_help: (libc)Argp Helper Functions.
* argp_usage: (libc)Argp Helper Functions.
* argz_add: (libc)Argz Functions.
* argz_add_sep: (libc)Argz Functions.
* argz_append: (libc)Argz Functions.
* argz_count: (libc)Argz Functions.
* argz_create: (libc)Argz Functions.
* argz_create_sep: (libc)Argz Functions.
* argz_delete: (libc)Argz Functions.
* argz_extract: (libc)Argz Functions.
* argz_insert: (libc)Argz Functions.
* argz_next: (libc)Argz Functions.
* argz_replace: (libc)Argz Functions.
* argz_stringify: (libc)Argz Functions.
* asctime: (libc)Formatting Calendar Time.
* asctime_r: (libc)Formatting Calendar Time.
* asin: (libc)Inverse Trig Functions.
* asinf: (libc)Inverse Trig Functions.
* asinfN: (libc)Inverse Trig Functions.
* asinfNx: (libc)Inverse Trig Functions.
* asinh: (libc)Hyperbolic Functions.
* asinhf: (libc)Hyperbolic Functions.
* asinhfN: (libc)Hyperbolic Functions.
* asinhfNx: (libc)Hyperbolic Functions.
* asinhl: (libc)Hyperbolic Functions.
* asinl: (libc)Inverse Trig Functions.
* asprintf: (libc)Dynamic Output.
* assert: (libc)Consistency Checking.
* assert_perror: (libc)Consistency Checking.
* atan2: (libc)Inverse Trig Functions.
* atan2f: (libc)Inverse Trig Functions.
* atan2fN: (libc)Inverse Trig Functions.
* atan2fNx: (libc)Inverse Trig Functions.
* atan2l: (libc)Inverse Trig Functions.
* atan: (libc)Inverse Trig Functions.
* atanf: (libc)Inverse Trig Functions.
* atanfN: (libc)Inverse Trig Functions.
* atanfNx: (libc)Inverse Trig Functions.
* atanh: (libc)Hyperbolic Functions.
* atanhf: (libc)Hyperbolic Functions.
* atanhfN: (libc)Hyperbolic Functions.
* atanhfNx: (libc)Hyperbolic Functions.
* atanhl: (libc)Hyperbolic Functions.
* atanl: (libc)Inverse Trig Functions.
* atexit: (libc)Cleanups on Exit.
* atof: (libc)Parsing of Floats.
* atoi: (libc)Parsing of Integers.
* atol: (libc)Parsing of Integers.
* atoll: (libc)Parsing of Integers.
* backtrace: (libc)Backtraces.
* backtrace_symbols: (libc)Backtraces.
* backtrace_symbols_fd: (libc)Backtraces.
* basename: (libc)Finding Tokens in a String.
* basename: (libc)Finding Tokens in a String.
* bcmp: (libc)String/Array Comparison.
* bcopy: (libc)Copying Strings and Arrays.
* bind: (libc)Setting Address.
* bind_textdomain_codeset: (libc)Charset conversion in gettext.
* bindtextdomain: (libc)Locating gettext catalog.
* brk: (libc)Resizing the Data Segment.
* bsearch: (libc)Array Search Function.
* btowc: (libc)Converting a Character.
* bzero: (libc)Copying Strings and Arrays.
* cabs: (libc)Absolute Value.
* cabsf: (libc)Absolute Value.
* cabsfN: (libc)Absolute Value.
* cabsfNx: (libc)Absolute Value.
* cabsl: (libc)Absolute Value.
* cacos: (libc)Inverse Trig Functions.
* cacosf: (libc)Inverse Trig Functions.
* cacosfN: (libc)Inverse Trig Functions.
* cacosfNx: (libc)Inverse Trig Functions.
* cacosh: (libc)Hyperbolic Functions.
* cacoshf: (libc)Hyperbolic Functions.
* cacoshfN: (libc)Hyperbolic Functions.
* cacoshfNx: (libc)Hyperbolic Functions.
* cacoshl: (libc)Hyperbolic Functions.
* cacosl: (libc)Inverse Trig Functions.
* call_once: (libc)Call Once.
* calloc: (libc)Allocating Cleared Space.
* canonicalize: (libc)FP Bit Twiddling.
* canonicalize_file_name: (libc)Symbolic Links.
* canonicalizef: (libc)FP Bit Twiddling.
* canonicalizefN: (libc)FP Bit Twiddling.
* canonicalizefNx: (libc)FP Bit Twiddling.
* canonicalizel: (libc)FP Bit Twiddling.
* carg: (libc)Operations on Complex.
* cargf: (libc)Operations on Complex.
* cargfN: (libc)Operations on Complex.
* cargfNx: (libc)Operations on Complex.
* cargl: (libc)Operations on Complex.
* casin: (libc)Inverse Trig Functions.
* casinf: (libc)Inverse Trig Functions.
* casinfN: (libc)Inverse Trig Functions.
* casinfNx: (libc)Inverse Trig Functions.
* casinh: (libc)Hyperbolic Functions.
* casinhf: (libc)Hyperbolic Functions.
* casinhfN: (libc)Hyperbolic Functions.
* casinhfNx: (libc)Hyperbolic Functions.
* casinhl: (libc)Hyperbolic Functions.
* casinl: (libc)Inverse Trig Functions.
* catan: (libc)Inverse Trig Functions.
* catanf: (libc)Inverse Trig Functions.
* catanfN: (libc)Inverse Trig Functions.
* catanfNx: (libc)Inverse Trig Functions.
* catanh: (libc)Hyperbolic Functions.
* catanhf: (libc)Hyperbolic Functions.
* catanhfN: (libc)Hyperbolic Functions.
* catanhfNx: (libc)Hyperbolic Functions.
* catanhl: (libc)Hyperbolic Functions.
* catanl: (libc)Inverse Trig Functions.
* catclose: (libc)The catgets Functions.
* catgets: (libc)The catgets Functions.
* catopen: (libc)The catgets Functions.
* cbrt: (libc)Exponents and Logarithms.
* cbrtf: (libc)Exponents and Logarithms.
* cbrtfN: (libc)Exponents and Logarithms.
* cbrtfNx: (libc)Exponents and Logarithms.
* cbrtl: (libc)Exponents and Logarithms.
* ccos: (libc)Trig Functions.
* ccosf: (libc)Trig Functions.
* ccosfN: (libc)Trig Functions.
* ccosfNx: (libc)Trig Functions.
* ccosh: (libc)Hyperbolic Functions.
* ccoshf: (libc)Hyperbolic Functions.
* ccoshfN: (libc)Hyperbolic Functions.
* ccoshfNx: (libc)Hyperbolic Functions.
* ccoshl: (libc)Hyperbolic Functions.
* ccosl: (libc)Trig Functions.
* ceil: (libc)Rounding Functions.
* ceilf: (libc)Rounding Functions.
* ceilfN: (libc)Rounding Functions.
* ceilfNx: (libc)Rounding Functions.
* ceill: (libc)Rounding Functions.
* cexp: (libc)Exponents and Logarithms.
* cexpf: (libc)Exponents and Logarithms.
* cexpfN: (libc)Exponents and Logarithms.
* cexpfNx: (libc)Exponents and Logarithms.
* cexpl: (libc)Exponents and Logarithms.
* cfgetispeed: (libc)Line Speed.
* cfgetospeed: (libc)Line Speed.
* cfmakeraw: (libc)Noncanonical Input.
* cfsetispeed: (libc)Line Speed.
* cfsetospeed: (libc)Line Speed.
* cfsetspeed: (libc)Line Speed.
* chdir: (libc)Working Directory.
* chmod: (libc)Setting Permissions.
* chown: (libc)File Owner.
* cimag: (libc)Operations on Complex.
* cimagf: (libc)Operations on Complex.
* cimagfN: (libc)Operations on Complex.
* cimagfNx: (libc)Operations on Complex.
* cimagl: (libc)Operations on Complex.
* clearenv: (libc)Environment Access.
* clearerr: (libc)Error Recovery.
* clearerr_unlocked: (libc)Error Recovery.
* clock: (libc)CPU Time.
* clog10: (libc)Exponents and Logarithms.
* clog10f: (libc)Exponents and Logarithms.
* clog10fN: (libc)Exponents and Logarithms.
* clog10fNx: (libc)Exponents and Logarithms.
* clog10l: (libc)Exponents and Logarithms.
* clog: (libc)Exponents and Logarithms.
* clogf: (libc)Exponents and Logarithms.
* clogfN: (libc)Exponents and Logarithms.
* clogfNx: (libc)Exponents and Logarithms.
* clogl: (libc)Exponents and Logarithms.
* close: (libc)Opening and Closing Files.
* closedir: (libc)Reading/Closing Directory.
* closelog: (libc)closelog.
* cnd_broadcast: (libc)ISO C Condition Variables.
* cnd_destroy: (libc)ISO C Condition Variables.
* cnd_init: (libc)ISO C Condition Variables.
* cnd_signal: (libc)ISO C Condition Variables.
* cnd_timedwait: (libc)ISO C Condition Variables.
* cnd_wait: (libc)ISO C Condition Variables.
* confstr: (libc)String Parameters.
* conj: (libc)Operations on Complex.
* conjf: (libc)Operations on Complex.
* conjfN: (libc)Operations on Complex.
* conjfNx: (libc)Operations on Complex.
* conjl: (libc)Operations on Complex.
* connect: (libc)Connecting.
* copy_file_range: (libc)Copying File Data.
* copysign: (libc)FP Bit Twiddling.
* copysignf: (libc)FP Bit Twiddling.
* copysignfN: (libc)FP Bit Twiddling.
* copysignfNx: (libc)FP Bit Twiddling.
* copysignl: (libc)FP Bit Twiddling.
* cos: (libc)Trig Functions.
* cosf: (libc)Trig Functions.
* cosfN: (libc)Trig Functions.
* cosfNx: (libc)Trig Functions.
* cosh: (libc)Hyperbolic Functions.
* coshf: (libc)Hyperbolic Functions.
* coshfN: (libc)Hyperbolic Functions.
* coshfNx: (libc)Hyperbolic Functions.
* coshl: (libc)Hyperbolic Functions.
* cosl: (libc)Trig Functions.
* cpow: (libc)Exponents and Logarithms.
* cpowf: (libc)Exponents and Logarithms.
* cpowfN: (libc)Exponents and Logarithms.
* cpowfNx: (libc)Exponents and Logarithms.
* cpowl: (libc)Exponents and Logarithms.
* cproj: (libc)Operations on Complex.
* cprojf: (libc)Operations on Complex.
* cprojfN: (libc)Operations on Complex.
* cprojfNx: (libc)Operations on Complex.
* cprojl: (libc)Operations on Complex.
* creal: (libc)Operations on Complex.
* crealf: (libc)Operations on Complex.
* crealfN: (libc)Operations on Complex.
* crealfNx: (libc)Operations on Complex.
* creall: (libc)Operations on Complex.
* creat64: (libc)Opening and Closing Files.
* creat: (libc)Opening and Closing Files.
* crypt: (libc)Passphrase Storage.
* crypt_r: (libc)Passphrase Storage.
* csin: (libc)Trig Functions.
* csinf: (libc)Trig Functions.
* csinfN: (libc)Trig Functions.
* csinfNx: (libc)Trig Functions.
* csinh: (libc)Hyperbolic Functions.
* csinhf: (libc)Hyperbolic Functions.
* csinhfN: (libc)Hyperbolic Functions.
* csinhfNx: (libc)Hyperbolic Functions.
* csinhl: (libc)Hyperbolic Functions.
* csinl: (libc)Trig Functions.
* csqrt: (libc)Exponents and Logarithms.
* csqrtf: (libc)Exponents and Logarithms.
* csqrtfN: (libc)Exponents and Logarithms.
* csqrtfNx: (libc)Exponents and Logarithms.
* csqrtl: (libc)Exponents and Logarithms.
* ctan: (libc)Trig Functions.
* ctanf: (libc)Trig Functions.
* ctanfN: (libc)Trig Functions.
* ctanfNx: (libc)Trig Functions.
* ctanh: (libc)Hyperbolic Functions.
* ctanhf: (libc)Hyperbolic Functions.
* ctanhfN: (libc)Hyperbolic Functions.
* ctanhfNx: (libc)Hyperbolic Functions.
* ctanhl: (libc)Hyperbolic Functions.
* ctanl: (libc)Trig Functions.
* ctermid: (libc)Identifying the Terminal.
* ctime: (libc)Formatting Calendar Time.
* ctime_r: (libc)Formatting Calendar Time.
* cuserid: (libc)Who Logged In.
* daddl: (libc)Misc FP Arithmetic.
* dcgettext: (libc)Translation with gettext.
* dcngettext: (libc)Advanced gettext functions.
* ddivl: (libc)Misc FP Arithmetic.
* dgettext: (libc)Translation with gettext.
* difftime: (libc)Elapsed Time.
* dirfd: (libc)Opening a Directory.
* dirname: (libc)Finding Tokens in a String.
* div: (libc)Integer Division.
* dmull: (libc)Misc FP Arithmetic.
* dngettext: (libc)Advanced gettext functions.
* drand48: (libc)SVID Random.
* drand48_r: (libc)SVID Random.
* drem: (libc)Remainder Functions.
* dremf: (libc)Remainder Functions.
* dreml: (libc)Remainder Functions.
* dsubl: (libc)Misc FP Arithmetic.
* dup2: (libc)Duplicating Descriptors.
* dup: (libc)Duplicating Descriptors.
* ecvt: (libc)System V Number Conversion.
* ecvt_r: (libc)System V Number Conversion.
* endfsent: (libc)fstab.
* endgrent: (libc)Scanning All Groups.
* endhostent: (libc)Host Names.
* endmntent: (libc)mtab.
* endnetent: (libc)Networks Database.
* endnetgrent: (libc)Lookup Netgroup.
* endprotoent: (libc)Protocols Database.
* endpwent: (libc)Scanning All Users.
* endservent: (libc)Services Database.
* endutent: (libc)Manipulating the Database.
* endutxent: (libc)XPG Functions.
* envz_add: (libc)Envz Functions.
* envz_entry: (libc)Envz Functions.
* envz_get: (libc)Envz Functions.
* envz_merge: (libc)Envz Functions.
* envz_remove: (libc)Envz Functions.
* envz_strip: (libc)Envz Functions.
* erand48: (libc)SVID Random.
* erand48_r: (libc)SVID Random.
* erf: (libc)Special Functions.
* erfc: (libc)Special Functions.
* erfcf: (libc)Special Functions.
* erfcfN: (libc)Special Functions.
* erfcfNx: (libc)Special Functions.
* erfcl: (libc)Special Functions.
* erff: (libc)Special Functions.
* erffN: (libc)Special Functions.
* erffNx: (libc)Special Functions.
* erfl: (libc)Special Functions.
* err: (libc)Error Messages.
* errno: (libc)Checking for Errors.
* error: (libc)Error Messages.
* error_at_line: (libc)Error Messages.
* errx: (libc)Error Messages.
* execl: (libc)Executing a File.
* execle: (libc)Executing a File.
* execlp: (libc)Executing a File.
* execv: (libc)Executing a File.
* execve: (libc)Executing a File.
* execvp: (libc)Executing a File.
* exit: (libc)Normal Termination.
* exp10: (libc)Exponents and Logarithms.
* exp10f: (libc)Exponents and Logarithms.
* exp10fN: (libc)Exponents and Logarithms.
* exp10fNx: (libc)Exponents and Logarithms.
* exp10l: (libc)Exponents and Logarithms.
* exp2: (libc)Exponents and Logarithms.
* exp2f: (libc)Exponents and Logarithms.
* exp2fN: (libc)Exponents and Logarithms.
* exp2fNx: (libc)Exponents and Logarithms.
* exp2l: (libc)Exponents and Logarithms.
* exp: (libc)Exponents and Logarithms.
* expf: (libc)Exponents and Logarithms.
* expfN: (libc)Exponents and Logarithms.
* expfNx: (libc)Exponents and Logarithms.
* expl: (libc)Exponents and Logarithms.
* explicit_bzero: (libc)Erasing Sensitive Data.
* expm1: (libc)Exponents and Logarithms.
* expm1f: (libc)Exponents and Logarithms.
* expm1fN: (libc)Exponents and Logarithms.
* expm1fNx: (libc)Exponents and Logarithms.
* expm1l: (libc)Exponents and Logarithms.
* fMaddfN: (libc)Misc FP Arithmetic.
* fMaddfNx: (libc)Misc FP Arithmetic.
* fMdivfN: (libc)Misc FP Arithmetic.
* fMdivfNx: (libc)Misc FP Arithmetic.
* fMmulfN: (libc)Misc FP Arithmetic.
* fMmulfNx: (libc)Misc FP Arithmetic.
* fMsubfN: (libc)Misc FP Arithmetic.
* fMsubfNx: (libc)Misc FP Arithmetic.
* fMxaddfN: (libc)Misc FP Arithmetic.
* fMxaddfNx: (libc)Misc FP Arithmetic.
* fMxdivfN: (libc)Misc FP Arithmetic.
* fMxdivfNx: (libc)Misc FP Arithmetic.
* fMxmulfN: (libc)Misc FP Arithmetic.
* fMxmulfNx: (libc)Misc FP Arithmetic.
* fMxsubfN: (libc)Misc FP Arithmetic.
* fMxsubfNx: (libc)Misc FP Arithmetic.
* fabs: (libc)Absolute Value.
* fabsf: (libc)Absolute Value.
* fabsfN: (libc)Absolute Value.
* fabsfNx: (libc)Absolute Value.
* fabsl: (libc)Absolute Value.
* fadd: (libc)Misc FP Arithmetic.
* faddl: (libc)Misc FP Arithmetic.
* fchdir: (libc)Working Directory.
* fchmod: (libc)Setting Permissions.
* fchown: (libc)File Owner.
* fclose: (libc)Closing Streams.
* fcloseall: (libc)Closing Streams.
* fcntl: (libc)Control Operations.
* fcvt: (libc)System V Number Conversion.
* fcvt_r: (libc)System V Number Conversion.
* fdatasync: (libc)Synchronizing I/O.
* fdim: (libc)Misc FP Arithmetic.
* fdimf: (libc)Misc FP Arithmetic.
* fdimfN: (libc)Misc FP Arithmetic.
* fdimfNx: (libc)Misc FP Arithmetic.
* fdiml: (libc)Misc FP Arithmetic.
* fdiv: (libc)Misc FP Arithmetic.
* fdivl: (libc)Misc FP Arithmetic.
* fdopen: (libc)Descriptors and Streams.
* fdopendir: (libc)Opening a Directory.
* feclearexcept: (libc)Status bit operations.
* fedisableexcept: (libc)Control Functions.
* feenableexcept: (libc)Control Functions.
* fegetenv: (libc)Control Functions.
* fegetexcept: (libc)Control Functions.
* fegetexceptflag: (libc)Status bit operations.
* fegetmode: (libc)Control Functions.
* fegetround: (libc)Rounding.
* feholdexcept: (libc)Control Functions.
* feof: (libc)EOF and Errors.
* feof_unlocked: (libc)EOF and Errors.
* feraiseexcept: (libc)Status bit operations.
* ferror: (libc)EOF and Errors.
* ferror_unlocked: (libc)EOF and Errors.
* fesetenv: (libc)Control Functions.
* fesetexcept: (libc)Status bit operations.
* fesetexceptflag: (libc)Status bit operations.
* fesetmode: (libc)Control Functions.
* fesetround: (libc)Rounding.
* fetestexcept: (libc)Status bit operations.
* fetestexceptflag: (libc)Status bit operations.
* feupdateenv: (libc)Control Functions.
* fflush: (libc)Flushing Buffers.
* fflush_unlocked: (libc)Flushing Buffers.
* fgetc: (libc)Character Input.
* fgetc_unlocked: (libc)Character Input.
* fgetgrent: (libc)Scanning All Groups.
* fgetgrent_r: (libc)Scanning All Groups.
* fgetpos64: (libc)Portable Positioning.
* fgetpos: (libc)Portable Positioning.
* fgetpwent: (libc)Scanning All Users.
* fgetpwent_r: (libc)Scanning All Users.
* fgets: (libc)Line Input.
* fgets_unlocked: (libc)Line Input.
* fgetwc: (libc)Character Input.
* fgetwc_unlocked: (libc)Character Input.
* fgetws: (libc)Line Input.
* fgetws_unlocked: (libc)Line Input.
* fileno: (libc)Descriptors and Streams.
* fileno_unlocked: (libc)Descriptors and Streams.
* finite: (libc)Floating Point Classes.
* finitef: (libc)Floating Point Classes.
* finitel: (libc)Floating Point Classes.
* flockfile: (libc)Streams and Threads.
* floor: (libc)Rounding Functions.
* floorf: (libc)Rounding Functions.
* floorfN: (libc)Rounding Functions.
* floorfNx: (libc)Rounding Functions.
* floorl: (libc)Rounding Functions.
* fma: (libc)Misc FP Arithmetic.
* fmaf: (libc)Misc FP Arithmetic.
* fmafN: (libc)Misc FP Arithmetic.
* fmafNx: (libc)Misc FP Arithmetic.
* fmal: (libc)Misc FP Arithmetic.
* fmax: (libc)Misc FP Arithmetic.
* fmaxf: (libc)Misc FP Arithmetic.
* fmaxfN: (libc)Misc FP Arithmetic.
* fmaxfNx: (libc)Misc FP Arithmetic.
* fmaxl: (libc)Misc FP Arithmetic.
* fmaxmag: (libc)Misc FP Arithmetic.
* fmaxmagf: (libc)Misc FP Arithmetic.
* fmaxmagfN: (libc)Misc FP Arithmetic.
* fmaxmagfNx: (libc)Misc FP Arithmetic.
* fmaxmagl: (libc)Misc FP Arithmetic.
* fmemopen: (libc)String Streams.
* fmin: (libc)Misc FP Arithmetic.
* fminf: (libc)Misc FP Arithmetic.
* fminfN: (libc)Misc FP Arithmetic.
* fminfNx: (libc)Misc FP Arithmetic.
* fminl: (libc)Misc FP Arithmetic.
* fminmag: (libc)Misc FP Arithmetic.
* fminmagf: (libc)Misc FP Arithmetic.
* fminmagfN: (libc)Misc FP Arithmetic.
* fminmagfNx: (libc)Misc FP Arithmetic.
* fminmagl: (libc)Misc FP Arithmetic.
* fmod: (libc)Remainder Functions.
* fmodf: (libc)Remainder Functions.
* fmodfN: (libc)Remainder Functions.
* fmodfNx: (libc)Remainder Functions.
* fmodl: (libc)Remainder Functions.
* fmtmsg: (libc)Printing Formatted Messages.
* fmul: (libc)Misc FP Arithmetic.
* fmull: (libc)Misc FP Arithmetic.
* fnmatch: (libc)Wildcard Matching.
* fopen64: (libc)Opening Streams.
* fopen: (libc)Opening Streams.
* fopencookie: (libc)Streams and Cookies.
* fork: (libc)Creating a Process.
* forkpty: (libc)Pseudo-Terminal Pairs.
* fpathconf: (libc)Pathconf.
* fpclassify: (libc)Floating Point Classes.
* fprintf: (libc)Formatted Output Functions.
* fputc: (libc)Simple Output.
* fputc_unlocked: (libc)Simple Output.
* fputs: (libc)Simple Output.
* fputs_unlocked: (libc)Simple Output.
* fputwc: (libc)Simple Output.
* fputwc_unlocked: (libc)Simple Output.
* fputws: (libc)Simple Output.
* fputws_unlocked: (libc)Simple Output.
* fread: (libc)Block Input/Output.
* fread_unlocked: (libc)Block Input/Output.
* free: (libc)Freeing after Malloc.
* freopen64: (libc)Opening Streams.
* freopen: (libc)Opening Streams.
* frexp: (libc)Normalization Functions.
* frexpf: (libc)Normalization Functions.
* frexpfN: (libc)Normalization Functions.
* frexpfNx: (libc)Normalization Functions.
* frexpl: (libc)Normalization Functions.
* fromfp: (libc)Rounding Functions.
* fromfpf: (libc)Rounding Functions.
* fromfpfN: (libc)Rounding Functions.
* fromfpfNx: (libc)Rounding Functions.
* fromfpl: (libc)Rounding Functions.
* fromfpx: (libc)Rounding Functions.
* fromfpxf: (libc)Rounding Functions.
* fromfpxfN: (libc)Rounding Functions.
* fromfpxfNx: (libc)Rounding Functions.
* fromfpxl: (libc)Rounding Functions.
* fscanf: (libc)Formatted Input Functions.
* fseek: (libc)File Positioning.
* fseeko64: (libc)File Positioning.
* fseeko: (libc)File Positioning.
* fsetpos64: (libc)Portable Positioning.
* fsetpos: (libc)Portable Positioning.
* fstat64: (libc)Reading Attributes.
* fstat: (libc)Reading Attributes.
* fsub: (libc)Misc FP Arithmetic.
* fsubl: (libc)Misc FP Arithmetic.
* fsync: (libc)Synchronizing I/O.
* ftell: (libc)File Positioning.
* ftello64: (libc)File Positioning.
* ftello: (libc)File Positioning.
* ftruncate64: (libc)File Size.
* ftruncate: (libc)File Size.
* ftrylockfile: (libc)Streams and Threads.
* ftw64: (libc)Working with Directory Trees.
* ftw: (libc)Working with Directory Trees.
* funlockfile: (libc)Streams and Threads.
* futimes: (libc)File Times.
* fwide: (libc)Streams and I18N.
* fwprintf: (libc)Formatted Output Functions.
* fwrite: (libc)Block Input/Output.
* fwrite_unlocked: (libc)Block Input/Output.
* fwscanf: (libc)Formatted Input Functions.
* gamma: (libc)Special Functions.
* gammaf: (libc)Special Functions.
* gammal: (libc)Special Functions.
* gcvt: (libc)System V Number Conversion.
* get_avphys_pages: (libc)Query Memory Parameters.
* get_current_dir_name: (libc)Working Directory.
* get_nprocs: (libc)Processor Resources.
* get_nprocs_conf: (libc)Processor Resources.
* get_phys_pages: (libc)Query Memory Parameters.
* getauxval: (libc)Auxiliary Vector.
* getc: (libc)Character Input.
* getc_unlocked: (libc)Character Input.
* getchar: (libc)Character Input.
* getchar_unlocked: (libc)Character Input.
* getcontext: (libc)System V contexts.
* getcwd: (libc)Working Directory.
* getdate: (libc)General Time String Parsing.
* getdate_r: (libc)General Time String Parsing.
* getdelim: (libc)Line Input.
* getdomainnname: (libc)Host Identification.
* getegid: (libc)Reading Persona.
* getentropy: (libc)Unpredictable Bytes.
* getenv: (libc)Environment Access.
* geteuid: (libc)Reading Persona.
* getfsent: (libc)fstab.
* getfsfile: (libc)fstab.
* getfsspec: (libc)fstab.
* getgid: (libc)Reading Persona.
* getgrent: (libc)Scanning All Groups.
* getgrent_r: (libc)Scanning All Groups.
* getgrgid: (libc)Lookup Group.
* getgrgid_r: (libc)Lookup Group.
* getgrnam: (libc)Lookup Group.
* getgrnam_r: (libc)Lookup Group.
* getgrouplist: (libc)Setting Groups.
* getgroups: (libc)Reading Persona.
* gethostbyaddr: (libc)Host Names.
* gethostbyaddr_r: (libc)Host Names.
* gethostbyname2: (libc)Host Names.
* gethostbyname2_r: (libc)Host Names.
* gethostbyname: (libc)Host Names.
* gethostbyname_r: (libc)Host Names.
* gethostent: (libc)Host Names.
* gethostid: (libc)Host Identification.
* gethostname: (libc)Host Identification.
* getitimer: (libc)Setting an Alarm.
* getline: (libc)Line Input.
* getloadavg: (libc)Processor Resources.
* getlogin: (libc)Who Logged In.
* getmntent: (libc)mtab.
* getmntent_r: (libc)mtab.
* getnetbyaddr: (libc)Networks Database.
* getnetbyname: (libc)Networks Database.
* getnetent: (libc)Networks Database.
* getnetgrent: (libc)Lookup Netgroup.
* getnetgrent_r: (libc)Lookup Netgroup.
* getopt: (libc)Using Getopt.
* getopt_long: (libc)Getopt Long Options.
* getopt_long_only: (libc)Getopt Long Options.
* getpagesize: (libc)Query Memory Parameters.
* getpass: (libc)getpass.
* getpayload: (libc)FP Bit Twiddling.
* getpayloadf: (libc)FP Bit Twiddling.
* getpayloadfN: (libc)FP Bit Twiddling.
* getpayloadfNx: (libc)FP Bit Twiddling.
* getpayloadl: (libc)FP Bit Twiddling.
* getpeername: (libc)Who is Connected.
* getpgid: (libc)Process Group Functions.
* getpgrp: (libc)Process Group Functions.
* getpid: (libc)Process Identification.
* getppid: (libc)Process Identification.
* getpriority: (libc)Traditional Scheduling Functions.
* getprotobyname: (libc)Protocols Database.
* getprotobynumber: (libc)Protocols Database.
* getprotoent: (libc)Protocols Database.
* getpt: (libc)Allocation.
* getpwent: (libc)Scanning All Users.
* getpwent_r: (libc)Scanning All Users.
* getpwnam: (libc)Lookup User.
* getpwnam_r: (libc)Lookup User.
* getpwuid: (libc)Lookup User.
* getpwuid_r: (libc)Lookup User.
* getrandom: (libc)Unpredictable Bytes.
* getrlimit64: (libc)Limits on Resources.
* getrlimit: (libc)Limits on Resources.
* getrusage: (libc)Resource Usage.
* gets: (libc)Line Input.
* getservbyname: (libc)Services Database.
* getservbyport: (libc)Services Database.
* getservent: (libc)Services Database.
* getsid: (libc)Process Group Functions.
* getsockname: (libc)Reading Address.
* getsockopt: (libc)Socket Option Functions.
* getsubopt: (libc)Suboptions.
* gettext: (libc)Translation with gettext.
* gettimeofday: (libc)High-Resolution Calendar.
* getuid: (libc)Reading Persona.
* getumask: (libc)Setting Permissions.
* getutent: (libc)Manipulating the Database.
* getutent_r: (libc)Manipulating the Database.
* getutid: (libc)Manipulating the Database.
* getutid_r: (libc)Manipulating the Database.
* getutline: (libc)Manipulating the Database.
* getutline_r: (libc)Manipulating the Database.
* getutmp: (libc)XPG Functions.
* getutmpx: (libc)XPG Functions.
* getutxent: (libc)XPG Functions.
* getutxid: (libc)XPG Functions.
* getutxline: (libc)XPG Functions.
* getw: (libc)Character Input.
* getwc: (libc)Character Input.
* getwc_unlocked: (libc)Character Input.
* getwchar: (libc)Character Input.
* getwchar_unlocked: (libc)Character Input.
* getwd: (libc)Working Directory.
* glob64: (libc)Calling Glob.
* glob: (libc)Calling Glob.
* globfree64: (libc)More Flags for Globbing.
* globfree: (libc)More Flags for Globbing.
* gmtime: (libc)Broken-down Time.
* gmtime_r: (libc)Broken-down Time.
* grantpt: (libc)Allocation.
* gsignal: (libc)Signaling Yourself.
* gtty: (libc)BSD Terminal Modes.
* hasmntopt: (libc)mtab.
* hcreate: (libc)Hash Search Function.
* hcreate_r: (libc)Hash Search Function.
* hdestroy: (libc)Hash Search Function.
* hdestroy_r: (libc)Hash Search Function.
* hsearch: (libc)Hash Search Function.
* hsearch_r: (libc)Hash Search Function.
* htonl: (libc)Byte Order.
* htons: (libc)Byte Order.
* hypot: (libc)Exponents and Logarithms.
* hypotf: (libc)Exponents and Logarithms.
* hypotfN: (libc)Exponents and Logarithms.
* hypotfNx: (libc)Exponents and Logarithms.
* hypotl: (libc)Exponents and Logarithms.
* iconv: (libc)Generic Conversion Interface.
* iconv_close: (libc)Generic Conversion Interface.
* iconv_open: (libc)Generic Conversion Interface.
* if_freenameindex: (libc)Interface Naming.
* if_indextoname: (libc)Interface Naming.
* if_nameindex: (libc)Interface Naming.
* if_nametoindex: (libc)Interface Naming.
* ilogb: (libc)Exponents and Logarithms.
* ilogbf: (libc)Exponents and Logarithms.
* ilogbfN: (libc)Exponents and Logarithms.
* ilogbfNx: (libc)Exponents and Logarithms.
* ilogbl: (libc)Exponents and Logarithms.
* imaxabs: (libc)Absolute Value.
* imaxdiv: (libc)Integer Division.
* in6addr_any: (libc)Host Address Data Type.
* in6addr_loopback: (libc)Host Address Data Type.
* index: (libc)Search Functions.
* inet_addr: (libc)Host Address Functions.
* inet_aton: (libc)Host Address Functions.
* inet_lnaof: (libc)Host Address Functions.
* inet_makeaddr: (libc)Host Address Functions.
* inet_netof: (libc)Host Address Functions.
* inet_network: (libc)Host Address Functions.
* inet_ntoa: (libc)Host Address Functions.
* inet_ntop: (libc)Host Address Functions.
* inet_pton: (libc)Host Address Functions.
* initgroups: (libc)Setting Groups.
* initstate: (libc)BSD Random.
* initstate_r: (libc)BSD Random.
* innetgr: (libc)Netgroup Membership.
* ioctl: (libc)IOCTLs.
* isalnum: (libc)Classification of Characters.
* isalpha: (libc)Classification of Characters.
* isascii: (libc)Classification of Characters.
* isatty: (libc)Is It a Terminal.
* isblank: (libc)Classification of Characters.
* iscanonical: (libc)Floating Point Classes.
* iscntrl: (libc)Classification of Characters.
* isdigit: (libc)Classification of Characters.
* iseqsig: (libc)FP Comparison Functions.
* isfinite: (libc)Floating Point Classes.
* isgraph: (libc)Classification of Characters.
* isgreater: (libc)FP Comparison Functions.
* isgreaterequal: (libc)FP Comparison Functions.
* isinf: (libc)Floating Point Classes.
* isinff: (libc)Floating Point Classes.
* isinfl: (libc)Floating Point Classes.
* isless: (libc)FP Comparison Functions.
* islessequal: (libc)FP Comparison Functions.
* islessgreater: (libc)FP Comparison Functions.
* islower: (libc)Classification of Characters.
* isnan: (libc)Floating Point Classes.
* isnan: (libc)Floating Point Classes.
* isnanf: (libc)Floating Point Classes.
* isnanl: (libc)Floating Point Classes.
* isnormal: (libc)Floating Point Classes.
* isprint: (libc)Classification of Characters.
* ispunct: (libc)Classification of Characters.
* issignaling: (libc)Floating Point Classes.
* isspace: (libc)Classification of Characters.
* issubnormal: (libc)Floating Point Classes.
* isunordered: (libc)FP Comparison Functions.
* isupper: (libc)Classification of Characters.
* iswalnum: (libc)Classification of Wide Characters.
* iswalpha: (libc)Classification of Wide Characters.
* iswblank: (libc)Classification of Wide Characters.
* iswcntrl: (libc)Classification of Wide Characters.
* iswctype: (libc)Classification of Wide Characters.
* iswdigit: (libc)Classification of Wide Characters.
* iswgraph: (libc)Classification of Wide Characters.
* iswlower: (libc)Classification of Wide Characters.
* iswprint: (libc)Classification of Wide Characters.
* iswpunct: (libc)Classification of Wide Characters.
* iswspace: (libc)Classification of Wide Characters.
* iswupper: (libc)Classification of Wide Characters.
* iswxdigit: (libc)Classification of Wide Characters.
* isxdigit: (libc)Classification of Characters.
* iszero: (libc)Floating Point Classes.
* j0: (libc)Special Functions.
* j0f: (libc)Special Functions.
* j0fN: (libc)Special Functions.
* j0fNx: (libc)Special Functions.
* j0l: (libc)Special Functions.
* j1: (libc)Special Functions.
* j1f: (libc)Special Functions.
* j1fN: (libc)Special Functions.
* j1fNx: (libc)Special Functions.
* j1l: (libc)Special Functions.
* jn: (libc)Special Functions.
* jnf: (libc)Special Functions.
* jnfN: (libc)Special Functions.
* jnfNx: (libc)Special Functions.
* jnl: (libc)Special Functions.
* jrand48: (libc)SVID Random.
* jrand48_r: (libc)SVID Random.
* kill: (libc)Signaling Another Process.
* killpg: (libc)Signaling Another Process.
* l64a: (libc)Encode Binary Data.
* labs: (libc)Absolute Value.
* lcong48: (libc)SVID Random.
* lcong48_r: (libc)SVID Random.
* ldexp: (libc)Normalization Functions.
* ldexpf: (libc)Normalization Functions.
* ldexpfN: (libc)Normalization Functions.
* ldexpfNx: (libc)Normalization Functions.
* ldexpl: (libc)Normalization Functions.
* ldiv: (libc)Integer Division.
* lfind: (libc)Array Search Function.
* lgamma: (libc)Special Functions.
* lgamma_r: (libc)Special Functions.
* lgammaf: (libc)Special Functions.
* lgammafN: (libc)Special Functions.
* lgammafN_r: (libc)Special Functions.
* lgammafNx: (libc)Special Functions.
* lgammafNx_r: (libc)Special Functions.
* lgammaf_r: (libc)Special Functions.
* lgammal: (libc)Special Functions.
* lgammal_r: (libc)Special Functions.
* link: (libc)Hard Links.
* linkat: (libc)Hard Links.
* lio_listio64: (libc)Asynchronous Reads/Writes.
* lio_listio: (libc)Asynchronous Reads/Writes.
* listen: (libc)Listening.
* llabs: (libc)Absolute Value.
* lldiv: (libc)Integer Division.
* llogb: (libc)Exponents and Logarithms.
* llogbf: (libc)Exponents and Logarithms.
* llogbfN: (libc)Exponents and Logarithms.
* llogbfNx: (libc)Exponents and Logarithms.
* llogbl: (libc)Exponents and Logarithms.
* llrint: (libc)Rounding Functions.
* llrintf: (libc)Rounding Functions.
* llrintfN: (libc)Rounding Functions.
* llrintfNx: (libc)Rounding Functions.
* llrintl: (libc)Rounding Functions.
* llround: (libc)Rounding Functions.
* llroundf: (libc)Rounding Functions.
* llroundfN: (libc)Rounding Functions.
* llroundfNx: (libc)Rounding Functions.
* llroundl: (libc)Rounding Functions.
* localeconv: (libc)The Lame Way to Locale Data.
* localtime: (libc)Broken-down Time.
* localtime_r: (libc)Broken-down Time.
* log10: (libc)Exponents and Logarithms.
* log10f: (libc)Exponents and Logarithms.
* log10fN: (libc)Exponents and Logarithms.
* log10fNx: (libc)Exponents and Logarithms.
* log10l: (libc)Exponents and Logarithms.
* log1p: (libc)Exponents and Logarithms.
* log1pf: (libc)Exponents and Logarithms.
* log1pfN: (libc)Exponents and Logarithms.
* log1pfNx: (libc)Exponents and Logarithms.
* log1pl: (libc)Exponents and Logarithms.
* log2: (libc)Exponents and Logarithms.
* log2f: (libc)Exponents and Logarithms.
* log2fN: (libc)Exponents and Logarithms.
* log2fNx: (libc)Exponents and Logarithms.
* log2l: (libc)Exponents and Logarithms.
* log: (libc)Exponents and Logarithms.
* logb: (libc)Exponents and Logarithms.
* logbf: (libc)Exponents and Logarithms.
* logbfN: (libc)Exponents and Logarithms.
* logbfNx: (libc)Exponents and Logarithms.
* logbl: (libc)Exponents and Logarithms.
* logf: (libc)Exponents and Logarithms.
* logfN: (libc)Exponents and Logarithms.
* logfNx: (libc)Exponents and Logarithms.
* login: (libc)Logging In and Out.
* login_tty: (libc)Logging In and Out.
* logl: (libc)Exponents and Logarithms.
* logout: (libc)Logging In and Out.
* logwtmp: (libc)Logging In and Out.
* longjmp: (libc)Non-Local Details.
* lrand48: (libc)SVID Random.
* lrand48_r: (libc)SVID Random.
* lrint: (libc)Rounding Functions.
* lrintf: (libc)Rounding Functions.
* lrintfN: (libc)Rounding Functions.
* lrintfNx: (libc)Rounding Functions.
* lrintl: (libc)Rounding Functions.
* lround: (libc)Rounding Functions.
* lroundf: (libc)Rounding Functions.
* lroundfN: (libc)Rounding Functions.
* lroundfNx: (libc)Rounding Functions.
* lroundl: (libc)Rounding Functions.
* lsearch: (libc)Array Search Function.
* lseek64: (libc)File Position Primitive.
* lseek: (libc)File Position Primitive.
* lstat64: (libc)Reading Attributes.
* lstat: (libc)Reading Attributes.
* lutimes: (libc)File Times.
* madvise: (libc)Memory-mapped I/O.
* makecontext: (libc)System V contexts.
* mallinfo: (libc)Statistics of Malloc.
* malloc: (libc)Basic Allocation.
* mallopt: (libc)Malloc Tunable Parameters.
* mblen: (libc)Non-reentrant Character Conversion.
* mbrlen: (libc)Converting a Character.
* mbrtowc: (libc)Converting a Character.
* mbsinit: (libc)Keeping the state.
* mbsnrtowcs: (libc)Converting Strings.
* mbsrtowcs: (libc)Converting Strings.
* mbstowcs: (libc)Non-reentrant String Conversion.
* mbtowc: (libc)Non-reentrant Character Conversion.
* mcheck: (libc)Heap Consistency Checking.
* memalign: (libc)Aligned Memory Blocks.
* memccpy: (libc)Copying Strings and Arrays.
* memchr: (libc)Search Functions.
* memcmp: (libc)String/Array Comparison.
* memcpy: (libc)Copying Strings and Arrays.
* memfd_create: (libc)Memory-mapped I/O.
* memfrob: (libc)Obfuscating Data.
* memmem: (libc)Search Functions.
* memmove: (libc)Copying Strings and Arrays.
* mempcpy: (libc)Copying Strings and Arrays.
* memrchr: (libc)Search Functions.
* memset: (libc)Copying Strings and Arrays.
* mkdir: (libc)Creating Directories.
* mkdtemp: (libc)Temporary Files.
* mkfifo: (libc)FIFO Special Files.
* mknod: (libc)Making Special Files.
* mkstemp: (libc)Temporary Files.
* mktemp: (libc)Temporary Files.
* mktime: (libc)Broken-down Time.
* mlock2: (libc)Page Lock Functions.
* mlock: (libc)Page Lock Functions.
* mlockall: (libc)Page Lock Functions.
* mmap64: (libc)Memory-mapped I/O.
* mmap: (libc)Memory-mapped I/O.
* modf: (libc)Rounding Functions.
* modff: (libc)Rounding Functions.
* modffN: (libc)Rounding Functions.
* modffNx: (libc)Rounding Functions.
* modfl: (libc)Rounding Functions.
* mount: (libc)Mount-Unmount-Remount.
* mprobe: (libc)Heap Consistency Checking.
* mprotect: (libc)Memory Protection.
* mrand48: (libc)SVID Random.
* mrand48_r: (libc)SVID Random.
* mremap: (libc)Memory-mapped I/O.
* msync: (libc)Memory-mapped I/O.
* mtrace: (libc)Tracing malloc.
* mtx_destroy: (libc)ISO C Mutexes.
* mtx_init: (libc)ISO C Mutexes.
* mtx_lock: (libc)ISO C Mutexes.
* mtx_timedlock: (libc)ISO C Mutexes.
* mtx_trylock: (libc)ISO C Mutexes.
* mtx_unlock: (libc)ISO C Mutexes.
* munlock: (libc)Page Lock Functions.
* munlockall: (libc)Page Lock Functions.
* munmap: (libc)Memory-mapped I/O.
* muntrace: (libc)Tracing malloc.
* nan: (libc)FP Bit Twiddling.
* nanf: (libc)FP Bit Twiddling.
* nanfN: (libc)FP Bit Twiddling.
* nanfNx: (libc)FP Bit Twiddling.
* nanl: (libc)FP Bit Twiddling.
* nanosleep: (libc)Sleeping.
* nearbyint: (libc)Rounding Functions.
* nearbyintf: (libc)Rounding Functions.
* nearbyintfN: (libc)Rounding Functions.
* nearbyintfNx: (libc)Rounding Functions.
* nearbyintl: (libc)Rounding Functions.
* nextafter: (libc)FP Bit Twiddling.
* nextafterf: (libc)FP Bit Twiddling.
* nextafterfN: (libc)FP Bit Twiddling.
* nextafterfNx: (libc)FP Bit Twiddling.
* nextafterl: (libc)FP Bit Twiddling.
* nextdown: (libc)FP Bit Twiddling.
* nextdownf: (libc)FP Bit Twiddling.
* nextdownfN: (libc)FP Bit Twiddling.
* nextdownfNx: (libc)FP Bit Twiddling.
* nextdownl: (libc)FP Bit Twiddling.
* nexttoward: (libc)FP Bit Twiddling.
* nexttowardf: (libc)FP Bit Twiddling.
* nexttowardl: (libc)FP Bit Twiddling.
* nextup: (libc)FP Bit Twiddling.
* nextupf: (libc)FP Bit Twiddling.
* nextupfN: (libc)FP Bit Twiddling.
* nextupfNx: (libc)FP Bit Twiddling.
* nextupl: (libc)FP Bit Twiddling.
* nftw64: (libc)Working with Directory Trees.
* nftw: (libc)Working with Directory Trees.
* ngettext: (libc)Advanced gettext functions.
* nice: (libc)Traditional Scheduling Functions.
* nl_langinfo: (libc)The Elegant and Fast Way.
* nrand48: (libc)SVID Random.
* nrand48_r: (libc)SVID Random.
* ntohl: (libc)Byte Order.
* ntohs: (libc)Byte Order.
* ntp_adjtime: (libc)High Accuracy Clock.
* ntp_gettime: (libc)High Accuracy Clock.
* obstack_1grow: (libc)Growing Objects.
* obstack_1grow_fast: (libc)Extra Fast Growing.
* obstack_alignment_mask: (libc)Obstacks Data Alignment.
* obstack_alloc: (libc)Allocation in an Obstack.
* obstack_base: (libc)Status of an Obstack.
* obstack_blank: (libc)Growing Objects.
* obstack_blank_fast: (libc)Extra Fast Growing.
* obstack_chunk_size: (libc)Obstack Chunks.
* obstack_copy0: (libc)Allocation in an Obstack.
* obstack_copy: (libc)Allocation in an Obstack.
* obstack_finish: (libc)Growing Objects.
* obstack_free: (libc)Freeing Obstack Objects.
* obstack_grow0: (libc)Growing Objects.
* obstack_grow: (libc)Growing Objects.
* obstack_init: (libc)Preparing for Obstacks.
* obstack_int_grow: (libc)Growing Objects.
* obstack_int_grow_fast: (libc)Extra Fast Growing.
* obstack_next_free: (libc)Status of an Obstack.
* obstack_object_size: (libc)Growing Objects.
* obstack_object_size: (libc)Status of an Obstack.
* obstack_printf: (libc)Dynamic Output.
* obstack_ptr_grow: (libc)Growing Objects.
* obstack_ptr_grow_fast: (libc)Extra Fast Growing.
* obstack_room: (libc)Extra Fast Growing.
* obstack_vprintf: (libc)Variable Arguments Output.
* offsetof: (libc)Structure Measurement.
* on_exit: (libc)Cleanups on Exit.
* open64: (libc)Opening and Closing Files.
* open: (libc)Opening and Closing Files.
* open_memstream: (libc)String Streams.
* opendir: (libc)Opening a Directory.
* openlog: (libc)openlog.
* openpty: (libc)Pseudo-Terminal Pairs.
* parse_printf_format: (libc)Parsing a Template String.
* pathconf: (libc)Pathconf.
* pause: (libc)Using Pause.
* pclose: (libc)Pipe to a Subprocess.
* perror: (libc)Error Messages.
* pipe: (libc)Creating a Pipe.
* pkey_alloc: (libc)Memory Protection.
* pkey_free: (libc)Memory Protection.
* pkey_get: (libc)Memory Protection.
* pkey_mprotect: (libc)Memory Protection.
* pkey_set: (libc)Memory Protection.
* popen: (libc)Pipe to a Subprocess.
* posix_fallocate64: (libc)Storage Allocation.
* posix_fallocate: (libc)Storage Allocation.
* posix_memalign: (libc)Aligned Memory Blocks.
* pow: (libc)Exponents and Logarithms.
* powf: (libc)Exponents and Logarithms.
* powfN: (libc)Exponents and Logarithms.
* powfNx: (libc)Exponents and Logarithms.
* powl: (libc)Exponents and Logarithms.
* pread64: (libc)I/O Primitives.
* pread: (libc)I/O Primitives.
* preadv2: (libc)Scatter-Gather.
* preadv64: (libc)Scatter-Gather.
* preadv64v2: (libc)Scatter-Gather.
* preadv: (libc)Scatter-Gather.
* printf: (libc)Formatted Output Functions.
* printf_size: (libc)Predefined Printf Handlers.
* printf_size_info: (libc)Predefined Printf Handlers.
* psignal: (libc)Signal Messages.
* pthread_getattr_default_np: (libc)Default Thread Attributes.
* pthread_getspecific: (libc)Thread-specific Data.
* pthread_key_create: (libc)Thread-specific Data.
* pthread_key_delete: (libc)Thread-specific Data.
* pthread_setattr_default_np: (libc)Default Thread Attributes.
* pthread_setspecific: (libc)Thread-specific Data.
* ptsname: (libc)Allocation.
* ptsname_r: (libc)Allocation.
* putc: (libc)Simple Output.
* putc_unlocked: (libc)Simple Output.
* putchar: (libc)Simple Output.
* putchar_unlocked: (libc)Simple Output.
* putenv: (libc)Environment Access.
* putpwent: (libc)Writing a User Entry.
* puts: (libc)Simple Output.
* pututline: (libc)Manipulating the Database.
* pututxline: (libc)XPG Functions.
* putw: (libc)Simple Output.
* putwc: (libc)Simple Output.
* putwc_unlocked: (libc)Simple Output.
* putwchar: (libc)Simple Output.
* putwchar_unlocked: (libc)Simple Output.
* pwrite64: (libc)I/O Primitives.
* pwrite: (libc)I/O Primitives.
* pwritev2: (libc)Scatter-Gather.
* pwritev64: (libc)Scatter-Gather.
* pwritev64v2: (libc)Scatter-Gather.
* pwritev: (libc)Scatter-Gather.
* qecvt: (libc)System V Number Conversion.
* qecvt_r: (libc)System V Number Conversion.
* qfcvt: (libc)System V Number Conversion.
* qfcvt_r: (libc)System V Number Conversion.
* qgcvt: (libc)System V Number Conversion.
* qsort: (libc)Array Sort Function.
* raise: (libc)Signaling Yourself.
* rand: (libc)ISO Random.
* rand_r: (libc)ISO Random.
* random: (libc)BSD Random.
* random_r: (libc)BSD Random.
* rawmemchr: (libc)Search Functions.
* read: (libc)I/O Primitives.
* readdir64: (libc)Reading/Closing Directory.
* readdir64_r: (libc)Reading/Closing Directory.
* readdir: (libc)Reading/Closing Directory.
* readdir_r: (libc)Reading/Closing Directory.
* readlink: (libc)Symbolic Links.
* readv: (libc)Scatter-Gather.
* realloc: (libc)Changing Block Size.
* reallocarray: (libc)Changing Block Size.
* realpath: (libc)Symbolic Links.
* recv: (libc)Receiving Data.
* recvfrom: (libc)Receiving Datagrams.
* recvmsg: (libc)Receiving Datagrams.
* regcomp: (libc)POSIX Regexp Compilation.
* regerror: (libc)Regexp Cleanup.
* regexec: (libc)Matching POSIX Regexps.
* regfree: (libc)Regexp Cleanup.
* register_printf_function: (libc)Registering New Conversions.
* remainder: (libc)Remainder Functions.
* remainderf: (libc)Remainder Functions.
* remainderfN: (libc)Remainder Functions.
* remainderfNx: (libc)Remainder Functions.
* remainderl: (libc)Remainder Functions.
* remove: (libc)Deleting Files.
* rename: (libc)Renaming Files.
* rewind: (libc)File Positioning.
* rewinddir: (libc)Random Access Directory.
* rindex: (libc)Search Functions.
* rint: (libc)Rounding Functions.
* rintf: (libc)Rounding Functions.
* rintfN: (libc)Rounding Functions.
* rintfNx: (libc)Rounding Functions.
* rintl: (libc)Rounding Functions.
* rmdir: (libc)Deleting Files.
* round: (libc)Rounding Functions.
* roundeven: (libc)Rounding Functions.
* roundevenf: (libc)Rounding Functions.
* roundevenfN: (libc)Rounding Functions.
* roundevenfNx: (libc)Rounding Functions.
* roundevenl: (libc)Rounding Functions.
* roundf: (libc)Rounding Functions.
* roundfN: (libc)Rounding Functions.
* roundfNx: (libc)Rounding Functions.
* roundl: (libc)Rounding Functions.
* rpmatch: (libc)Yes-or-No Questions.
* sbrk: (libc)Resizing the Data Segment.
* scalb: (libc)Normalization Functions.
* scalbf: (libc)Normalization Functions.
* scalbl: (libc)Normalization Functions.
* scalbln: (libc)Normalization Functions.
* scalblnf: (libc)Normalization Functions.
* scalblnfN: (libc)Normalization Functions.
* scalblnfNx: (libc)Normalization Functions.
* scalblnl: (libc)Normalization Functions.
* scalbn: (libc)Normalization Functions.
* scalbnf: (libc)Normalization Functions.
* scalbnfN: (libc)Normalization Functions.
* scalbnfNx: (libc)Normalization Functions.
* scalbnl: (libc)Normalization Functions.
* scandir64: (libc)Scanning Directory Content.
* scandir: (libc)Scanning Directory Content.
* scanf: (libc)Formatted Input Functions.
* sched_get_priority_max: (libc)Basic Scheduling Functions.
* sched_get_priority_min: (libc)Basic Scheduling Functions.
* sched_getaffinity: (libc)CPU Affinity.
* sched_getparam: (libc)Basic Scheduling Functions.
* sched_getscheduler: (libc)Basic Scheduling Functions.
* sched_rr_get_interval: (libc)Basic Scheduling Functions.
* sched_setaffinity: (libc)CPU Affinity.
* sched_setparam: (libc)Basic Scheduling Functions.
* sched_setscheduler: (libc)Basic Scheduling Functions.
* sched_yield: (libc)Basic Scheduling Functions.
* secure_getenv: (libc)Environment Access.
* seed48: (libc)SVID Random.
* seed48_r: (libc)SVID Random.
* seekdir: (libc)Random Access Directory.
* select: (libc)Waiting for I/O.
* sem_close: (libc)Semaphores.
* sem_destroy: (libc)Semaphores.
* sem_getvalue: (libc)Semaphores.
* sem_init: (libc)Semaphores.
* sem_open: (libc)Semaphores.
* sem_post: (libc)Semaphores.
* sem_timedwait: (libc)Semaphores.
* sem_trywait: (libc)Semaphores.
* sem_unlink: (libc)Semaphores.
* sem_wait: (libc)Semaphores.
* semctl: (libc)Semaphores.
* semget: (libc)Semaphores.
* semop: (libc)Semaphores.
* semtimedop: (libc)Semaphores.
* send: (libc)Sending Data.
* sendmsg: (libc)Receiving Datagrams.
* sendto: (libc)Sending Datagrams.
* setbuf: (libc)Controlling Buffering.
* setbuffer: (libc)Controlling Buffering.
* setcontext: (libc)System V contexts.
* setdomainname: (libc)Host Identification.
* setegid: (libc)Setting Groups.
* setenv: (libc)Environment Access.
* seteuid: (libc)Setting User ID.
* setfsent: (libc)fstab.
* setgid: (libc)Setting Groups.
* setgrent: (libc)Scanning All Groups.
* setgroups: (libc)Setting Groups.
* sethostent: (libc)Host Names.
* sethostid: (libc)Host Identification.
* sethostname: (libc)Host Identification.
* setitimer: (libc)Setting an Alarm.
* setjmp: (libc)Non-Local Details.
* setlinebuf: (libc)Controlling Buffering.
* setlocale: (libc)Setting the Locale.
* setlogmask: (libc)setlogmask.
* setmntent: (libc)mtab.
* setnetent: (libc)Networks Database.
* setnetgrent: (libc)Lookup Netgroup.
* setpayload: (libc)FP Bit Twiddling.
* setpayloadf: (libc)FP Bit Twiddling.
* setpayloadfN: (libc)FP Bit Twiddling.
* setpayloadfNx: (libc)FP Bit Twiddling.
* setpayloadl: (libc)FP Bit Twiddling.
* setpayloadsig: (libc)FP Bit Twiddling.
* setpayloadsigf: (libc)FP Bit Twiddling.
* setpayloadsigfN: (libc)FP Bit Twiddling.
* setpayloadsigfNx: (libc)FP Bit Twiddling.
* setpayloadsigl: (libc)FP Bit Twiddling.
* setpgid: (libc)Process Group Functions.
* setpgrp: (libc)Process Group Functions.
* setpriority: (libc)Traditional Scheduling Functions.
* setprotoent: (libc)Protocols Database.
* setpwent: (libc)Scanning All Users.
* setregid: (libc)Setting Groups.
* setreuid: (libc)Setting User ID.
* setrlimit64: (libc)Limits on Resources.
* setrlimit: (libc)Limits on Resources.
* setservent: (libc)Services Database.
* setsid: (libc)Process Group Functions.
* setsockopt: (libc)Socket Option Functions.
* setstate: (libc)BSD Random.
* setstate_r: (libc)BSD Random.
* settimeofday: (libc)High-Resolution Calendar.
* setuid: (libc)Setting User ID.
* setutent: (libc)Manipulating the Database.
* setutxent: (libc)XPG Functions.
* setvbuf: (libc)Controlling Buffering.
* shm_open: (libc)Memory-mapped I/O.
* shm_unlink: (libc)Memory-mapped I/O.
* shutdown: (libc)Closing a Socket.
* sigaction: (libc)Advanced Signal Handling.
* sigaddset: (libc)Signal Sets.
* sigaltstack: (libc)Signal Stack.
* sigblock: (libc)BSD Signal Handling.
* sigdelset: (libc)Signal Sets.
* sigemptyset: (libc)Signal Sets.
* sigfillset: (libc)Signal Sets.
* siginterrupt: (libc)BSD Signal Handling.
* sigismember: (libc)Signal Sets.
* siglongjmp: (libc)Non-Local Exits and Signals.
* sigmask: (libc)BSD Signal Handling.
* signal: (libc)Basic Signal Handling.
* signbit: (libc)FP Bit Twiddling.
* significand: (libc)Normalization Functions.
* significandf: (libc)Normalization Functions.
* significandl: (libc)Normalization Functions.
* sigpause: (libc)BSD Signal Handling.
* sigpending: (libc)Checking for Pending Signals.
* sigprocmask: (libc)Process Signal Mask.
* sigsetjmp: (libc)Non-Local Exits and Signals.
* sigsetmask: (libc)BSD Signal Handling.
* sigstack: (libc)Signal Stack.
* sigsuspend: (libc)Sigsuspend.
* sin: (libc)Trig Functions.
* sincos: (libc)Trig Functions.
* sincosf: (libc)Trig Functions.
* sincosfN: (libc)Trig Functions.
* sincosfNx: (libc)Trig Functions.
* sincosl: (libc)Trig Functions.
* sinf: (libc)Trig Functions.
* sinfN: (libc)Trig Functions.
* sinfNx: (libc)Trig Functions.
* sinh: (libc)Hyperbolic Functions.
* sinhf: (libc)Hyperbolic Functions.
* sinhfN: (libc)Hyperbolic Functions.
* sinhfNx: (libc)Hyperbolic Functions.
* sinhl: (libc)Hyperbolic Functions.
* sinl: (libc)Trig Functions.
* sleep: (libc)Sleeping.
* snprintf: (libc)Formatted Output Functions.
* socket: (libc)Creating a Socket.
* socketpair: (libc)Socket Pairs.
* sprintf: (libc)Formatted Output Functions.
* sqrt: (libc)Exponents and Logarithms.
* sqrtf: (libc)Exponents and Logarithms.
* sqrtfN: (libc)Exponents and Logarithms.
* sqrtfNx: (libc)Exponents and Logarithms.
* sqrtl: (libc)Exponents and Logarithms.
* srand48: (libc)SVID Random.
* srand48_r: (libc)SVID Random.
* srand: (libc)ISO Random.
* srandom: (libc)BSD Random.
* srandom_r: (libc)BSD Random.
* sscanf: (libc)Formatted Input Functions.
* ssignal: (libc)Basic Signal Handling.
* stat64: (libc)Reading Attributes.
* stat: (libc)Reading Attributes.
* stime: (libc)Simple Calendar Time.
* stpcpy: (libc)Copying Strings and Arrays.
* stpncpy: (libc)Truncating Strings.
* strcasecmp: (libc)String/Array Comparison.
* strcasestr: (libc)Search Functions.
* strcat: (libc)Concatenating Strings.
* strchr: (libc)Search Functions.
* strchrnul: (libc)Search Functions.
* strcmp: (libc)String/Array Comparison.
* strcoll: (libc)Collation Functions.
* strcpy: (libc)Copying Strings and Arrays.
* strcspn: (libc)Search Functions.
* strdup: (libc)Copying Strings and Arrays.
* strdupa: (libc)Copying Strings and Arrays.
* strerror: (libc)Error Messages.
* strerror_r: (libc)Error Messages.
* strfmon: (libc)Formatting Numbers.
* strfromd: (libc)Printing of Floats.
* strfromf: (libc)Printing of Floats.
* strfromfN: (libc)Printing of Floats.
* strfromfNx: (libc)Printing of Floats.
* strfroml: (libc)Printing of Floats.
* strfry: (libc)Shuffling Bytes.
* strftime: (libc)Formatting Calendar Time.
* strlen: (libc)String Length.
* strncasecmp: (libc)String/Array Comparison.
* strncat: (libc)Truncating Strings.
* strncmp: (libc)String/Array Comparison.
* strncpy: (libc)Truncating Strings.
* strndup: (libc)Truncating Strings.
* strndupa: (libc)Truncating Strings.
* strnlen: (libc)String Length.
* strpbrk: (libc)Search Functions.
* strptime: (libc)Low-Level Time String Parsing.
* strrchr: (libc)Search Functions.
* strsep: (libc)Finding Tokens in a String.
* strsignal: (libc)Signal Messages.
* strspn: (libc)Search Functions.
* strstr: (libc)Search Functions.
* strtod: (libc)Parsing of Floats.
* strtof: (libc)Parsing of Floats.
* strtofN: (libc)Parsing of Floats.
* strtofNx: (libc)Parsing of Floats.
* strtoimax: (libc)Parsing of Integers.
* strtok: (libc)Finding Tokens in a String.
* strtok_r: (libc)Finding Tokens in a String.
* strtol: (libc)Parsing of Integers.
* strtold: (libc)Parsing of Floats.
* strtoll: (libc)Parsing of Integers.
* strtoq: (libc)Parsing of Integers.
* strtoul: (libc)Parsing of Integers.
* strtoull: (libc)Parsing of Integers.
* strtoumax: (libc)Parsing of Integers.
* strtouq: (libc)Parsing of Integers.
* strverscmp: (libc)String/Array Comparison.
* strxfrm: (libc)Collation Functions.
* stty: (libc)BSD Terminal Modes.
* swapcontext: (libc)System V contexts.
* swprintf: (libc)Formatted Output Functions.
* swscanf: (libc)Formatted Input Functions.
* symlink: (libc)Symbolic Links.
* sync: (libc)Synchronizing I/O.
* syscall: (libc)System Calls.
* sysconf: (libc)Sysconf Definition.
* sysctl: (libc)System Parameters.
* syslog: (libc)syslog; vsyslog.
* system: (libc)Running a Command.
* sysv_signal: (libc)Basic Signal Handling.
* tan: (libc)Trig Functions.
* tanf: (libc)Trig Functions.
* tanfN: (libc)Trig Functions.
* tanfNx: (libc)Trig Functions.
* tanh: (libc)Hyperbolic Functions.
* tanhf: (libc)Hyperbolic Functions.
* tanhfN: (libc)Hyperbolic Functions.
* tanhfNx: (libc)Hyperbolic Functions.
* tanhl: (libc)Hyperbolic Functions.
* tanl: (libc)Trig Functions.
* tcdrain: (libc)Line Control.
* tcflow: (libc)Line Control.
* tcflush: (libc)Line Control.
* tcgetattr: (libc)Mode Functions.
* tcgetpgrp: (libc)Terminal Access Functions.
* tcgetsid: (libc)Terminal Access Functions.
* tcsendbreak: (libc)Line Control.
* tcsetattr: (libc)Mode Functions.
* tcsetpgrp: (libc)Terminal Access Functions.
* tdelete: (libc)Tree Search Function.
* tdestroy: (libc)Tree Search Function.
* telldir: (libc)Random Access Directory.
* tempnam: (libc)Temporary Files.
* textdomain: (libc)Locating gettext catalog.
* tfind: (libc)Tree Search Function.
* tgamma: (libc)Special Functions.
* tgammaf: (libc)Special Functions.
* tgammafN: (libc)Special Functions.
* tgammafNx: (libc)Special Functions.
* tgammal: (libc)Special Functions.
* thrd_create: (libc)ISO C Thread Management.
* thrd_current: (libc)ISO C Thread Management.
* thrd_detach: (libc)ISO C Thread Management.
* thrd_equal: (libc)ISO C Thread Management.
* thrd_exit: (libc)ISO C Thread Management.
* thrd_join: (libc)ISO C Thread Management.
* thrd_sleep: (libc)ISO C Thread Management.
* thrd_yield: (libc)ISO C Thread Management.
* time: (libc)Simple Calendar Time.
* timegm: (libc)Broken-down Time.
* timelocal: (libc)Broken-down Time.
* times: (libc)Processor Time.
* tmpfile64: (libc)Temporary Files.
* tmpfile: (libc)Temporary Files.
* tmpnam: (libc)Temporary Files.
* tmpnam_r: (libc)Temporary Files.
* toascii: (libc)Case Conversion.
* tolower: (libc)Case Conversion.
* totalorder: (libc)FP Comparison Functions.
* totalorderf: (libc)FP Comparison Functions.
* totalorderfN: (libc)FP Comparison Functions.
* totalorderfNx: (libc)FP Comparison Functions.
* totalorderl: (libc)FP Comparison Functions.
* totalordermag: (libc)FP Comparison Functions.
* totalordermagf: (libc)FP Comparison Functions.
* totalordermagfN: (libc)FP Comparison Functions.
* totalordermagfNx: (libc)FP Comparison Functions.
* totalordermagl: (libc)FP Comparison Functions.
* toupper: (libc)Case Conversion.
* towctrans: (libc)Wide Character Case Conversion.
* towlower: (libc)Wide Character Case Conversion.
* towupper: (libc)Wide Character Case Conversion.
* trunc: (libc)Rounding Functions.
* truncate64: (libc)File Size.
* truncate: (libc)File Size.
* truncf: (libc)Rounding Functions.
* truncfN: (libc)Rounding Functions.
* truncfNx: (libc)Rounding Functions.
* truncl: (libc)Rounding Functions.
* tsearch: (libc)Tree Search Function.
* tss_create: (libc)ISO C Thread-local Storage.
* tss_delete: (libc)ISO C Thread-local Storage.
* tss_get: (libc)ISO C Thread-local Storage.
* tss_set: (libc)ISO C Thread-local Storage.
* ttyname: (libc)Is It a Terminal.
* ttyname_r: (libc)Is It a Terminal.
* twalk: (libc)Tree Search Function.
* tzset: (libc)Time Zone Functions.
* ufromfp: (libc)Rounding Functions.
* ufromfpf: (libc)Rounding Functions.
* ufromfpfN: (libc)Rounding Functions.
* ufromfpfNx: (libc)Rounding Functions.
* ufromfpl: (libc)Rounding Functions.
* ufromfpx: (libc)Rounding Functions.
* ufromfpxf: (libc)Rounding Functions.
* ufromfpxfN: (libc)Rounding Functions.
* ufromfpxfNx: (libc)Rounding Functions.
* ufromfpxl: (libc)Rounding Functions.
* ulimit: (libc)Limits on Resources.
* umask: (libc)Setting Permissions.
* umount2: (libc)Mount-Unmount-Remount.
* umount: (libc)Mount-Unmount-Remount.
* uname: (libc)Platform Type.
* ungetc: (libc)How Unread.
* ungetwc: (libc)How Unread.
* unlink: (libc)Deleting Files.
* unlockpt: (libc)Allocation.
* unsetenv: (libc)Environment Access.
* updwtmp: (libc)Manipulating the Database.
* utime: (libc)File Times.
* utimes: (libc)File Times.
* utmpname: (libc)Manipulating the Database.
* utmpxname: (libc)XPG Functions.
* va_arg: (libc)Argument Macros.
* va_copy: (libc)Argument Macros.
* va_end: (libc)Argument Macros.
* va_start: (libc)Argument Macros.
* valloc: (libc)Aligned Memory Blocks.
* vasprintf: (libc)Variable Arguments Output.
* verr: (libc)Error Messages.
* verrx: (libc)Error Messages.
* versionsort64: (libc)Scanning Directory Content.
* versionsort: (libc)Scanning Directory Content.
* vfork: (libc)Creating a Process.
* vfprintf: (libc)Variable Arguments Output.
* vfscanf: (libc)Variable Arguments Input.
* vfwprintf: (libc)Variable Arguments Output.
* vfwscanf: (libc)Variable Arguments Input.
* vlimit: (libc)Limits on Resources.
* vprintf: (libc)Variable Arguments Output.
* vscanf: (libc)Variable Arguments Input.
* vsnprintf: (libc)Variable Arguments Output.
* vsprintf: (libc)Variable Arguments Output.
* vsscanf: (libc)Variable Arguments Input.
* vswprintf: (libc)Variable Arguments Output.
* vswscanf: (libc)Variable Arguments Input.
* vsyslog: (libc)syslog; vsyslog.
* vtimes: (libc)Resource Usage.
* vwarn: (libc)Error Messages.
* vwarnx: (libc)Error Messages.
* vwprintf: (libc)Variable Arguments Output.
* vwscanf: (libc)Variable Arguments Input.
* wait3: (libc)BSD Wait Functions.
* wait4: (libc)Process Completion.
* wait: (libc)Process Completion.
* waitpid: (libc)Process Completion.
* warn: (libc)Error Messages.
* warnx: (libc)Error Messages.
* wcpcpy: (libc)Copying Strings and Arrays.
* wcpncpy: (libc)Truncating Strings.
* wcrtomb: (libc)Converting a Character.
* wcscasecmp: (libc)String/Array Comparison.
* wcscat: (libc)Concatenating Strings.
* wcschr: (libc)Search Functions.
* wcschrnul: (libc)Search Functions.
* wcscmp: (libc)String/Array Comparison.
* wcscoll: (libc)Collation Functions.
* wcscpy: (libc)Copying Strings and Arrays.
* wcscspn: (libc)Search Functions.
* wcsdup: (libc)Copying Strings and Arrays.
* wcsftime: (libc)Formatting Calendar Time.
* wcslen: (libc)String Length.
* wcsncasecmp: (libc)String/Array Comparison.
* wcsncat: (libc)Truncating Strings.
* wcsncmp: (libc)String/Array Comparison.
* wcsncpy: (libc)Truncating Strings.
* wcsnlen: (libc)String Length.
* wcsnrtombs: (libc)Converting Strings.
* wcspbrk: (libc)Search Functions.
* wcsrchr: (libc)Search Functions.
* wcsrtombs: (libc)Converting Strings.
* wcsspn: (libc)Search Functions.
* wcsstr: (libc)Search Functions.
* wcstod: (libc)Parsing of Floats.
* wcstof: (libc)Parsing of Floats.
* wcstofN: (libc)Parsing of Floats.
* wcstofNx: (libc)Parsing of Floats.
* wcstoimax: (libc)Parsing of Integers.
* wcstok: (libc)Finding Tokens in a String.
* wcstol: (libc)Parsing of Integers.
* wcstold: (libc)Parsing of Floats.
* wcstoll: (libc)Parsing of Integers.
* wcstombs: (libc)Non-reentrant String Conversion.
* wcstoq: (libc)Parsing of Integers.
* wcstoul: (libc)Parsing of Integers.
* wcstoull: (libc)Parsing of Integers.
* wcstoumax: (libc)Parsing of Integers.
* wcstouq: (libc)Parsing of Integers.
* wcswcs: (libc)Search Functions.
* wcsxfrm: (libc)Collation Functions.
* wctob: (libc)Converting a Character.
* wctomb: (libc)Non-reentrant Character Conversion.
* wctrans: (libc)Wide Character Case Conversion.
* wctype: (libc)Classification of Wide Characters.
* wmemchr: (libc)Search Functions.
* wmemcmp: (libc)String/Array Comparison.
* wmemcpy: (libc)Copying Strings and Arrays.
* wmemmove: (libc)Copying Strings and Arrays.
* wmempcpy: (libc)Copying Strings and Arrays.
* wmemset: (libc)Copying Strings and Arrays.
* wordexp: (libc)Calling Wordexp.
* wordfree: (libc)Calling Wordexp.
* wprintf: (libc)Formatted Output Functions.
* write: (libc)I/O Primitives.
* writev: (libc)Scatter-Gather.
* wscanf: (libc)Formatted Input Functions.
* y0: (libc)Special Functions.
* y0f: (libc)Special Functions.
* y0fN: (libc)Special Functions.
* y0fNx: (libc)Special Functions.
* y0l: (libc)Special Functions.
* y1: (libc)Special Functions.
* y1f: (libc)Special Functions.
* y1fN: (libc)Special Functions.
* y1fNx: (libc)Special Functions.
* y1l: (libc)Special Functions.
* yn: (libc)Special Functions.
* ynf: (libc)Special Functions.
* ynfN: (libc)Special Functions.
* ynfNx: (libc)Special Functions.
* ynl: (libc)Special Functions.
END-INFO-DIR-ENTRY

File: libc.info, Node: Copying File Data, Next: Memory-mapped I/O, Prev: Scatter-Gather, Up: Low-Level I/O
13.7 Copying data between two files
===================================
A special function is provided to copy data between two files on the
same file system. The system can optimize such copy operations. This
is particularly important on network file systems, where the data would
otherwise have to be transferred twice over the network.
Note that this function only copies file data, but not metadata such
as file permissions or extended attributes.
-- Function: ssize_t copy_file_range (int INPUTFD, off64_t *INPUTPOS,
int OUTPUTFD, off64_t *OUTPUTPOS, ssize_t LENGTH, unsigned int
FLAGS)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function copies up to LENGTH bytes from the file descriptor
INPUTFD to the file descriptor OUTPUTFD.
The function can operate on both the current file position (like
read and write) and an explicit offset (like pread and
pwrite). If the INPUTPOS pointer is null, the file position of
INPUTFD is used as the starting point of the copy operation, and
the file position is advanced during it. If INPUTPOS is not null,
then *INPUTPOS is used as the starting point of the copy
operation, and *INPUTPOS is incremented by the number of copied
bytes, but the file position remains unchanged. Similar rules
apply to OUTPUTFD and OUTPUTPOS for the output file position.
The FLAGS argument is currently reserved and must be zero.
The copy_file_range function returns the number of bytes copied.
This can be less than the specified LENGTH in case the input file
contains fewer remaining bytes than LENGTH, or if a read or write
failure occurs. The return value is zero if the end of the input
file is encountered immediately.
If no bytes can be copied, to report an error, copy_file_range
returns the value -1 and sets errno. The table below lists some
of the error conditions for this function.
ENOSYS
The kernel does not implement the required functionality.
EISDIR
At least one of the descriptors INPUTFD or OUTPUTFD refers to
a directory.
EINVAL
At least one of the descriptors INPUTFD or OUTPUTFD refers to
a non-regular, non-directory file (such as a socket or a
FIFO).
The input or output positions before are after the copy
operations are outside of an implementation-defined limit.
The FLAGS argument is not zero.
EFBIG
The new file size would exceed the process file size limit.
*Note Limits on Resources::.
The input or output positions before are after the copy
operations are outside of an implementation-defined limit.
This can happen if the file was not opened with large file
support (LFS) on 32-bit machines, and the copy operation would
create a file which is larger than what off_t could
represent.
EBADF
The argument INPUTFD is not a valid file descriptor open for
reading.
The argument OUTPUTFD is not a valid file descriptor open for
writing, or OUTPUTFD has been opened with O_APPEND.
In addition, copy_file_range can fail with the error codes which
are used by read, pread, write, and pwrite.
The copy_file_range function is a cancellation point. In case of
cancellation, the input location (the file position or the value at
*INPUTPOS) is indeterminate.

File: libc.info, Node: Memory-mapped I/O, Next: Waiting for I/O, Prev: Copying File Data, Up: Low-Level I/O
13.8 Memory-mapped I/O
======================
On modern operating systems, it is possible to “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 efficient than read or 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.
Since mmapped pages can be stored back to their file when physical
memory is low, it is possible to mmap files orders of magnitude larger
than both the physical memory _and_ swap space. The only limit is
address space. The theoretical limit is 4GB on a 32-bit machine -
however, the actual limit will be smaller since some areas will be
reserved for other purposes. If the LFS interface is used the file size
on 32-bit systems is not limited to 2GB (offsets are signed which
reduces the addressable area of 4GB by half); the full 64-bit are
available.
Memory mapping only works on entire pages of memory. Thus, addresses
for mapping must be page-aligned, and length values will be rounded up.
To determine the default size of a page the machine uses one should use:
size_t page_size = (size_t) sysconf (_SC_PAGESIZE);
On some systems, mappings can use larger page sizes for certain
files, and applications can request larger page sizes for anonymous
mappings as well (see the MAP_HUGETLB flag below).
The following functions are declared in sys/mman.h:
-- Function: void * mmap (void *ADDRESS, size_t LENGTH, int PROTECT,
int FLAGS, int FILEDES, off_t OFFSET)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The mmap function creates a new mapping, connected to bytes
(OFFSET) to (OFFSET + LENGTH - 1) in the file open on FILEDES. A
new reference for the file specified by FILEDES is created, which
is not removed by closing the file.
ADDRESS gives a preferred starting address for the mapping. NULL
expresses no preference. Any previous mapping at that address is
automatically removed. The address you give may still be changed,
unless you use the MAP_FIXED flag.
PROTECT contains flags that control what kind of access is
permitted. They include PROT_READ, PROT_WRITE, and
PROT_EXEC. The special flag PROT_NONE reserves a region of
address space for future use. The mprotect function can be used
to change the protection flags. *Note Memory Protection::.
FLAGS contains flags that control the nature of the map. One of
MAP_SHARED or MAP_PRIVATE must be specified.
They include:
MAP_PRIVATE
This specifies that writes to the region should never be
written back to the attached file. Instead, a copy is made
for the process, and the region will be swapped normally if
memory runs low. No other process will see the changes.
Since private mappings effectively revert to ordinary memory
when written to, you must have enough virtual memory for a
copy of the entire mmapped region if you use this mode with
PROT_WRITE.
MAP_SHARED
This specifies that writes to the region will be written back
to the file. Changes made will be shared immediately with
other processes mmaping the same file.
Note that actual writing may take place at any time. You need
to use msync, described below, if it is important that other
processes using conventional I/O get a consistent view of the
file.
MAP_FIXED
This forces the system to use the exact mapping address
specified in ADDRESS and fail if it cant.
MAP_ANONYMOUS
MAP_ANON
This flag tells the system to create an anonymous mapping, not
connected to a file. FILEDES and OFFSET are ignored, and the
region is initialized with zeros.
Anonymous maps are used as the basic primitive to extend the
heap on some systems. They are also useful to share data
between multiple tasks without creating a file.
On some systems using private anonymous mmaps is more
efficient than using malloc for large blocks. This is not
an issue with the GNU C Library, as the included malloc
automatically uses mmap where appropriate.
MAP_HUGETLB
This requests that the system uses an alternative page size
which is larger than the default page size for the mapping.
For some workloads, increasing the page size for large
mappings improves performance because the system needs to
handle far fewer pages. For other workloads which require
frequent transfer of pages between storage or different nodes,
the decreased page granularity may cause performance problems
due to the increased page size and larger transfers.
In order to create the mapping, the system needs physically
contiguous memory of the size of the increased page size. As
a result, MAP_HUGETLB mappings are affected by memory
fragmentation, and their creation can fail even if plenty of
memory is available in the system.
Not all file systems support mappings with an increased page
size.
The MAP_HUGETLB flag is specific to Linux.
mmap returns the address of the new mapping, or MAP_FAILED for
an error.
Possible errors include:
EINVAL
Either ADDRESS was unusable (because it is not a multiple of
the applicable page size), or inconsistent FLAGS were given.
If MAP_HUGETLB was specified, the file or system does not
support large page sizes.
EACCES
FILEDES was not open for the type of access specified in
PROTECT.
ENOMEM
Either there is not enough memory for the operation, or the
process is out of address space.
ENODEV
This file is of a type that doesnt support mapping.
ENOEXEC
The file is on a filesystem that doesnt support mapping.
-- Function: void * mmap64 (void *ADDRESS, size_t LENGTH, int PROTECT,
int FLAGS, int FILEDES, off64_t OFFSET)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The mmap64 function is equivalent to the mmap function but the
OFFSET parameter is of type off64_t. On 32-bit systems this
allows the file associated with the FILEDES descriptor to be larger
than 2GB. FILEDES must be a descriptor returned from a call to
open64 or fopen64 and freopen64 where the descriptor is
retrieved with fileno.
When the sources are translated with _FILE_OFFSET_BITS == 64 this
function is actually available under the name mmap. I.e., the
new, extended API using 64 bit file sizes and offsets transparently
replaces the old API.
-- Function: int munmap (void *ADDR, size_t LENGTH)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
munmap removes any memory maps from (ADDR) to (ADDR + LENGTH).
LENGTH should be the length of the mapping.
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 LENGTH is not an even number of pages, it will be
rounded up.
It returns 0 for success and -1 for an error.
One error is possible:
EINVAL
The memory range given was outside the user mmap range or
wasnt page aligned.
-- Function: int msync (void *ADDRESS, size_t LENGTH, int FLAGS)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
When using shared mappings, the kernel can write the file at any
time before the mapping is removed. To be certain data has
actually been written to the file and will be accessible to
non-memory-mapped I/O, it is necessary to use this function.
It operates on the region ADDRESS to (ADDRESS + LENGTH). It may be
used on part of a mapping or multiple mappings, however the region
given should not contain any unmapped space.
FLAGS can contain some options:
MS_SYNC
This flag makes sure the data is actually written _to disk_.
Normally msync only makes sure that accesses to a file with
conventional I/O reflect the recent changes.
MS_ASYNC
This tells msync to begin the synchronization, but not to
wait for it to complete.
msync returns 0 for success and -1 for error. Errors include:
EINVAL
An invalid region was given, or the FLAGS were invalid.
EFAULT
There is no existing mapping in at least part of the given
region.
-- Function: void * mremap (void *ADDRESS, size_t LENGTH, size_t
NEW_LENGTH, int FLAG)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function can be used to change the size of an existing memory
area. ADDRESS and LENGTH must cover a region entirely mapped in
the same mmap statement. A new mapping with the same
characteristics will be returned with the length NEW_LENGTH.
One option is possible, MREMAP_MAYMOVE. If it is given in FLAGS,
the system may remove the existing mapping and create a new one of
the desired length in another location.
The address of the resulting mapping is returned, or -1. Possible
error codes include:
EFAULT
There is no existing mapping in at least part of the original
region, or the region covers two or more distinct mappings.
EINVAL
The address given is misaligned or inappropriate.
EAGAIN
The region has pages locked, and if extended it would exceed
the processs resource limit for locked pages. *Note Limits
on Resources::.
ENOMEM
The region is private writable, and insufficient virtual
memory is available to extend it. Also, this error will occur
if MREMAP_MAYMOVE is not given and the extension would
collide with another mapped region.
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 not support mapping at all. Thus, programs using
mmap should have a fallback method to use should it fail. *Note
(standards)Mmap::.
-- Function: int madvise (void *ADDR, size_t LENGTH, int ADVICE)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function can be used to provide the system with ADVICE about
the intended usage patterns of the memory region starting at ADDR
and extending LENGTH bytes.
The valid BSD values for ADVICE are:
MADV_NORMAL
The region should receive no further special treatment.
MADV_RANDOM
The region will be accessed via random page references. The
kernel should page-in the minimal number of pages for each
page fault.
MADV_SEQUENTIAL
The region will be accessed via sequential page references.
This may cause the kernel to aggressively read-ahead,
expecting further sequential references after any page fault
within this region.
MADV_WILLNEED
The region will be needed. The pages within this region may
be pre-faulted in by the kernel.
MADV_DONTNEED
The region is no longer needed. The kernel may free these
pages, causing any changes to the pages to be lost, as well as
swapped out pages to be discarded.
MADV_HUGEPAGE
Indicate that it is beneficial to increase the page size for
this mapping. This can improve performance for larger
mappings because the system needs to handle far fewer pages.
However, if parts of the mapping are frequently transferred
between storage or different nodes, performance may suffer
because individual transfers can become substantially larger
due to the increased page size.
This flag is specific to Linux.
MADV_NOHUGEPAGE
Undo the effect of a previous MADV_HUGEPAGE advice. This
flag is specific to Linux.
The POSIX names are slightly different, but with the same meanings:
POSIX_MADV_NORMAL
This corresponds with BSDs MADV_NORMAL.
POSIX_MADV_RANDOM
This corresponds with BSDs MADV_RANDOM.
POSIX_MADV_SEQUENTIAL
This corresponds with BSDs MADV_SEQUENTIAL.
POSIX_MADV_WILLNEED
This corresponds with BSDs MADV_WILLNEED.
POSIX_MADV_DONTNEED
This corresponds with BSDs MADV_DONTNEED.
madvise returns 0 for success and -1 for error. Errors include:
EINVAL
An invalid region was given, or the ADVICE was invalid.
EFAULT
There is no existing mapping in at least part of the given
region.
-- Function: int shm_open (const char *NAME, int OFLAG, mode_t MODE)
Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
This function returns a file descriptor that can be used to
allocate shared memory via mmap. Unrelated processes can use same
NAME to create or open existing shared memory objects.
A NAME argument specifies the shared memory object to be opened.
In the GNU C Library it must be a string smaller than NAME_MAX
bytes starting with an optional slash but containing no other
slashes.
The semantics of OFLAG and MODE arguments is same as in open.
shm_open returns the file descriptor on success or -1 on error.
On failure errno is set.
-- Function: int shm_unlink (const char *NAME)
Preliminary: | MT-Safe locale | AS-Unsafe init heap lock |
AC-Unsafe lock mem fd | *Note POSIX Safety Concepts::.
This function is the inverse of shm_open and removes the object
with the given NAME previously created by shm_open.
shm_unlink returns 0 on success or -1 on error. On failure
errno is set.
-- Function: int memfd_create (const char *NAME, unsigned int FLAGS)
Preliminary: | MT-Safe | AS-Safe | AC-Safe fd | *Note POSIX Safety
Concepts::.
The memfd_create function returns a file descriptor which can be
used to create memory mappings using the mmap function. It is
similar to the shm_open function in the sense that these mappings
are not backed by actual files. However, the descriptor returned
by memfd_create does not correspond to a named object; the NAME
argument is used for debugging purposes only (e.g., will appear in
/proc), and separate invocations of memfd_create with the same
NAME will not return descriptors for the same region of memory.
The descriptor can also be used to create alias mappings within the
same process.
The descriptor initially refers to a zero-length file. Before
mappings can be created which are backed by memory, the file size
needs to be increased with the ftruncate function. *Note File
Size::.
The FLAGS argument can be a combination of the following flags:
MFD_CLOEXEC
The descriptor is created with the O_CLOEXEC flag.
MFD_ALLOW_SEALING
The descriptor supports the addition of seals using the
fcntl function.
MFD_HUGETLB
This requests that mappings created using the returned file
descriptor use a larger page size. See MAP_HUGETLB above
for details.
This flag is incompatible with MFD_ALLOW_SEALING.
memfd_create returns a file descriptor on success, and -1 on
failure.
The following errno error conditions are defined for this
function:
EINVAL
An invalid combination is specified in FLAGS, or NAME is too
long.
EFAULT
The NAME argument does not point to a string.
EMFILE
The operation would exceed the file descriptor limit for this
process.
ENFILE
The operation would exceed the system-wide file descriptor
limit.
ENOMEM
There is not enough memory for the operation.

File: libc.info, Node: Waiting for I/O, Next: Synchronizing I/O, Prev: Memory-mapped I/O, Up: Low-Level I/O
13.9 Waiting for Input or Output
================================
Sometimes a program needs to accept input on multiple input channels
whenever input arrives. For example, some workstations may have devices
such as a digitizing tablet, function button box, or dial box that are
connected via normal asynchronous serial interfaces; good user interface
style requires responding immediately to input on any device. Another
example is a program that acts as a server to several other processes
via pipes or sockets.
You cannot normally use read for this purpose, because this blocks
the program until input is available on one particular file descriptor;
input on other channels wont wake it up. You could set nonblocking
mode and poll each file descriptor in turn, but this is very
inefficient.
A better solution is to use the select function. This blocks the
program until input or output is ready on a specified set of file
descriptors, or until a timer expires, whichever comes first. This
facility is declared in the header file sys/types.h.
In the case of a server socket (*note Listening::), we say that
“input” is available when there are pending connections that could be
accepted (*note Accepting Connections::). accept for server sockets
blocks and interacts with select just as read does for normal input.
The file descriptor sets for the select function are specified as
fd_set objects. Here is the description of the data type and some
macros for manipulating these objects.
-- Data Type: fd_set
The fd_set data type represents file descriptor sets for the
select function. It is actually a bit array.
-- Macro: int FD_SETSIZE
The value of this macro is the maximum number of file descriptors
that a fd_set object can hold information about. On systems with
a fixed maximum number, FD_SETSIZE is at least that number. On
some systems, including GNU, there is no absolute limit on the
number of descriptors open, but this macro still has a constant
value which controls the number of bits in an fd_set; if you get
a file descriptor with a value as high as FD_SETSIZE, you cannot
put that descriptor into an fd_set.
-- Macro: void FD_ZERO (fd_set *SET)
Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This macro initializes the file descriptor set SET to be the empty
set.
-- Macro: void FD_SET (int FILEDES, fd_set *SET)
Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This macro adds FILEDES to the file descriptor set SET.
The FILEDES parameter must not have side effects since it is
evaluated more than once.
-- Macro: void FD_CLR (int FILEDES, fd_set *SET)
Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This macro removes FILEDES from the file descriptor set SET.
The FILEDES parameter must not have side effects since it is
evaluated more than once.
-- Macro: int FD_ISSET (int FILEDES, const fd_set *SET)
Preliminary: | MT-Safe race:set | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This macro returns a nonzero value (true) if FILEDES is a member of
the file descriptor set SET, and zero (false) otherwise.
The FILEDES parameter must not have side effects since it is
evaluated more than once.
Next, here is the description of the select function itself.
-- Function: int select (int NFDS, fd_set *READ-FDS, fd_set *WRITE-FDS,
fd_set *EXCEPT-FDS, struct timeval *TIMEOUT)
Preliminary: | MT-Safe race:read-fds race:write-fds race:except-fds
| AS-Safe | AC-Safe | *Note POSIX Safety Concepts::.
The select function blocks the calling process until there is
activity on any of the specified sets of file descriptors, or until
the timeout period has expired.
The file descriptors specified by the READ-FDS argument are checked
to see if they are ready for reading; the WRITE-FDS file
descriptors are checked to see if they are ready for writing; and
the EXCEPT-FDS file descriptors are checked for exceptional
conditions. You can pass a null pointer for any of these arguments
if you are not interested in checking for that kind of condition.
A file descriptor is considered ready for reading if a read call
will not block. This usually includes the read offset being at the
end of the file or there is an error to report. A server socket is
considered ready for reading if there is a pending connection which
can be accepted with accept; *note Accepting Connections::. A
client socket is ready for writing when its connection is fully
established; *note Connecting::.
“Exceptional conditions” does not mean errors—errors are reported
immediately when an erroneous system call is executed, and do not
constitute a state of the descriptor. Rather, they include
conditions such as the presence of an urgent message on a socket.
(*Note Sockets::, for information on urgent messages.)
The select function checks only the first NFDS file descriptors.
The usual thing is to pass FD_SETSIZE as the value of this
argument.
The TIMEOUT specifies the maximum time to wait. If you pass a null
pointer for this argument, it means to block indefinitely until one
of the file descriptors is ready. Otherwise, you should provide
the time in struct timeval format; see *note High-Resolution
Calendar::. Specify zero as the time (a struct timeval
containing all zeros) if you want to find out which descriptors are
ready without waiting if none are ready.
The normal return value from select is the total number of ready
file descriptors in all of the sets. Each of the argument sets is
overwritten with information about the descriptors that are ready
for the corresponding operation. Thus, to see if a particular
descriptor DESC has input, use FD_ISSET (DESC, READ-FDS) after
select returns.
If select returns because the timeout period expires, it returns
a value of zero.
Any signal will cause select to return immediately. So if your
program uses signals, you cant rely on select to keep waiting
for the full time specified. If you want to be sure of waiting for
a particular amount of time, you must check for EINTR and repeat
the select with a newly calculated timeout based on the current
time. See the example below. See also *note Interrupted
Primitives::.
If an error occurs, select returns -1 and does not modify the
argument file descriptor sets. The following errno error
conditions are defined for this function:
EBADF
One of the file descriptor sets specified an invalid file
descriptor.
EINTR
The operation was interrupted by a signal. *Note Interrupted
Primitives::.
EINVAL
The TIMEOUT argument is invalid; one of the components is
negative or too large.
*Portability Note:* The select function is a BSD Unix feature.
Here is an example showing how you can use select to establish a
timeout period for reading from a file descriptor. The input_timeout
function blocks the calling process until input is available on the file
descriptor, or until the timeout period expires.
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
int
input_timeout (int filedes, unsigned int seconds)
{
fd_set set;
struct timeval timeout;
/* Initialize the file descriptor set. */
FD_ZERO (&set);
FD_SET (filedes, &set);
/* Initialize the timeout data structure. */
timeout.tv_sec = seconds;
timeout.tv_usec = 0;
/* select returns 0 if timeout, 1 if input available, -1 if error. */
return TEMP_FAILURE_RETRY (select (FD_SETSIZE,
&set, NULL, NULL,
&timeout));
}
int
main (void)
{
fprintf (stderr, "select returned %d.\n",
input_timeout (STDIN_FILENO, 5));
return 0;
}
There is another example showing the use of select to multiplex
input from multiple sockets in *note Server Example::.

File: libc.info, Node: Synchronizing I/O, Next: Asynchronous I/O, Prev: Waiting for I/O, Up: Low-Level I/O
13.10 Synchronizing I/O operations
==================================
In most modern operating systems, the normal I/O operations are not
executed synchronously. I.e., even if a 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, you can use
special functions which ensure that all operations finish before they
return.
-- Function: void sync (void)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
A call to this function will not return as long as there is data
which has not been written to the device. All dirty buffers in the
kernel will be written and so an overall consistent system can be
achieved (if no other process in parallel writes data).
A prototype for sync can be found in unistd.h.
Programs more often want to ensure that data written to a given file
is committed, rather than all data in the system. For this, sync is
overkill.
-- Function: int fsync (int FILDES)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The fsync function can be used to make sure all data associated
with the open file FILDES is written to the device associated with
the descriptor. The function call does not return unless all
actions have finished.
A prototype for fsync can be found in unistd.h.
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
fsync is called. If the thread gets canceled these resources
stay allocated until the program ends. To avoid this, calls to
fsync should be protected using cancellation handlers.
The return value of the function is zero if no error occurred.
Otherwise it is -1 and the global variable ERRNO is set to the
following values:
EBADF
The descriptor FILDES is not valid.
EINVAL
No synchronization is possible since the system does not
implement this.
Sometimes it is not even necessary to write all data associated with
a file descriptor. E.g., in database files which do not change in size
it is enough to write all the file content data to the device.
Meta-information, like the modification time etc., are not that
important and leaving such information uncommitted does not prevent a
successful recovery of the file in case of a problem.
-- Function: int fdatasync (int FILDES)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
When a call to the 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.
Not all systems implement the fdatasync operation. On systems
missing this functionality fdatasync is emulated by a call to
fsync since the performed actions are a superset of those
required by fdatasync.
The prototype for fdatasync is in unistd.h.
The return value of the function is zero if no error occurred.
Otherwise it is -1 and the global variable ERRNO is set to the
following values:
EBADF
The descriptor FILDES is not valid.
EINVAL
No synchronization is possible since the system does not
implement this.

File: libc.info, Node: Asynchronous I/O, Next: Control Operations, Prev: Synchronizing I/O, Up: Low-Level I/O
13.11 Perform I/O Operations in Parallel
========================================
The POSIX.1b standard defines a new set of I/O operations which can
significantly reduce the time an application spends waiting for I/O. The
new functions allow a program to initiate one or more I/O operations and
then immediately resume normal work while the I/O operations are
executed in parallel. This functionality is available if the unistd.h
file defines the symbol _POSIX_ASYNCHRONOUS_IO.
These functions are part of the library with realtime functions named
librt. They are not actually part of the libc binary. The
implementation of these functions can be done using support in the
kernel (if available) or using an implementation based on threads at
userlevel. In the latter case it might be necessary to link
applications with the thread library libpthread in addition to
librt.
All AIO operations operate on files which were opened previously.
There might be arbitrarily many operations running for one file. The
asynchronous I/O operations are controlled using a data structure named
struct aiocb (“AIO control block”). It is defined in aio.h as
follows.
-- Data Type: struct aiocb
The POSIX.1b standard mandates that the 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 depending upon these elements is not portable and is highly
deprecated.
int aio_fildes
This element specifies the file descriptor to be used for the
operation. It must be a legal descriptor, otherwise the
operation will fail.
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 like terminals where an lseek call
would lead to an error.
off_t aio_offset
This element specifies the offset in the file at which the
operation (input or output) is performed. Since the
operations are carried out 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
descriptor.
volatile void *aio_buf
This is a pointer to the buffer with the data to be written or
the place where the read data is stored.
size_t aio_nbytes
This element specifies the length of the buffer pointed to by
aio_buf.
int aio_reqprio
If the platform has defined _POSIX_PRIORITIZED_IO and
_POSIX_PRIORITY_SCHEDULING, the AIO requests are processed
based on the current scheduling priority. The aio_reqprio
element can then be used to lower the priority of the AIO
operation.
struct sigevent aio_sigevent
This element specifies how the calling process is notified
once the operation terminates. If the sigev_notify element
is SIGEV_NONE, no notification is sent. If it is
SIGEV_SIGNAL, the signal determined by sigev_signo is
sent. Otherwise, sigev_notify must be SIGEV_THREAD. In
this case, a thread is created which starts executing the
function pointed to by sigev_notify_function.
int aio_lio_opcode
This element is only used by the lio_listio and
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:
LIO_READ
Start a read operation. Read from the file at position
aio_offset and store the next aio_nbytes bytes in the
buffer pointed to by aio_buf.
LIO_WRITE
Start a write operation. Write aio_nbytes bytes
starting at aio_buf into the file starting at position
aio_offset.
LIO_NOP
Do nothing for this control block. This value is useful
sometimes when an array of struct aiocb values contains
holes, i.e., some of the values must not be handled
although the whole array is presented to the lio_listio
function.
When the sources are compiled using _FILE_OFFSET_BITS == 64 on a
32 bit machine, this type is in fact struct aiocb64, since the
LFS interface transparently replaces the struct aiocb definition.
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 struct aiocb.
Particularly, all member names are the same.
-- Data Type: struct aiocb64
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.
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 like terminals where an lseek call
would lead to an error.
off64_t aio_offset
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 descriptor.
volatile void *aio_buf
This is a pointer to the buffer with the data to be written or
the place where the read data is stored.
size_t aio_nbytes
This element specifies the length of the buffer pointed to by
aio_buf.
int aio_reqprio
If for the platform _POSIX_PRIORITIZED_IO and
_POSIX_PRIORITY_SCHEDULING are defined the AIO requests are
processed based on the current scheduling priority. The
aio_reqprio element can then be used to lower the priority
of the AIO operation.
struct sigevent aio_sigevent
This element specifies how the calling process is notified
once the operation terminates. If the sigev_notify element
is SIGEV_NONE no notification is sent. If it is
SIGEV_SIGNAL, the signal determined by sigev_signo is
sent. Otherwise, sigev_notify must be SIGEV_THREAD in
which case a thread is created which starts executing the
function pointed to by sigev_notify_function.
int aio_lio_opcode
This element is only used by the lio_listio and
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 struct aiocb for a description of the
possible values.
When the sources are compiled using _FILE_OFFSET_BITS == 64 on a
32 bit machine, this type is available under the name struct
aiocb64, since the LFS transparently replaces the old interface.
* Menu:
* 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:: Cancellation of AIO Operations.
* Configuration of AIO:: How to optimize the AIO implementation.

File: libc.info, Node: Asynchronous Reads/Writes, Next: Status of AIO Operations, Up: Asynchronous I/O
13.11.1 Asynchronous Read and Write Operations
----------------------------------------------
-- Function: int aio_read (struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function initiates an asynchronous read operation. It
immediately returns after the operation was enqueued or when an
error was encountered.
The first aiocbp->aio_nbytes bytes of the file for which
aiocbp->aio_fildes is a descriptor are written to the buffer
starting at aiocbp->aio_buf. Reading starts at the absolute
position aiocbp->aio_offset in the file.
If prioritized I/O is supported by the platform the
aiocbp->aio_reqprio value is used to adjust the priority before
the request is actually enqueued.
The calling process is notified about the termination of the read
request according to the aiocbp->aio_sigevent value.
When 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 -1 and sets errno
to one of the following values:
EAGAIN
The request was not enqueued due to (temporarily) exceeded
resource limitations.
ENOSYS
The aio_read function is not implemented.
EBADF
The aiocbp->aio_fildes descriptor is not valid. This
condition need not be recognized before enqueueing the request
and so this error might also be signaled asynchronously.
EINVAL
The aiocbp->aio_offset or aiocbp->aio_reqpiro value is
invalid. This condition need not be recognized before
enqueueing the request and so this error might also be
signaled asynchronously.
If aio_read returns zero, the current status of the request can
be queried using aio_error and aio_return functions. As long
as the value returned by aio_error is EINPROGRESS the operation
has not yet completed. If 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 aio_return. The
returned value is the same as an equivalent call to read would
have returned. Possible error codes returned by aio_error are:
EBADF
The aiocbp->aio_fildes descriptor is not valid.
ECANCELED
The operation was canceled before the operation was finished
(*note Cancel AIO Operations::)
EINVAL
The aiocbp->aio_offset value is invalid.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact aio_read64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_read64 (struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function is similar to the aio_read function. The only
difference is that on 32 bit machines, the file descriptor should
be opened in the large file mode. Internally, aio_read64 uses
functionality equivalent to lseek64 (*note File Position
Primitive::) to position the file descriptor correctly for the
reading, as opposed to the lseek functionality used in
aio_read.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is available under the name aio_read and so
transparently replaces the interface for small files on 32 bit
machines.
To write data asynchronously to a file, there exists an equivalent
pair of functions with a very similar interface.
-- Function: int aio_write (struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function initiates an asynchronous write operation. The
function call immediately returns after the operation was enqueued
or if before this happens an error was encountered.
The first aiocbp->aio_nbytes bytes from the buffer starting at
aiocbp->aio_buf are written to the file for which
aiocbp->aio_fildes is a descriptor, starting at the absolute
position aiocbp->aio_offset in the file.
If prioritized I/O is supported by the platform, the
aiocbp->aio_reqprio value is used to adjust the priority before
the request is actually enqueued.
The calling process is notified about the termination of the read
request according to the aiocbp->aio_sigevent value.
When aio_write 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 -1 and sets errno to
one of the following values.
EAGAIN
The request was not enqueued due to (temporarily) exceeded
resource limitations.
ENOSYS
The aio_write function is not implemented.
EBADF
The aiocbp->aio_fildes descriptor is not valid. This
condition may not be recognized before enqueueing the request,
and so this error might also be signaled asynchronously.
EINVAL
The aiocbp->aio_offset or aiocbp->aio_reqprio value is
invalid. This condition may not be recognized before
enqueueing the request and so this error might also be
signaled asynchronously.
In the case aio_write returns zero, the current status of the
request can be queried using the aio_error and aio_return
functions. As long as the value returned by aio_error is
EINPROGRESS the operation has not yet completed. If 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 aio_return. The returned value is the same as an
equivalent call to read would have returned. Possible error
codes returned by aio_error are:
EBADF
The aiocbp->aio_fildes descriptor is not valid.
ECANCELED
The operation was canceled before the operation was finished.
(*note Cancel AIO Operations::)
EINVAL
The aiocbp->aio_offset value is invalid.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is in fact aio_write64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_write64 (struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function is similar to the aio_write function. The only
difference is that on 32 bit machines the file descriptor should be
opened in the large file mode. Internally aio_write64 uses
functionality equivalent to lseek64 (*note File Position
Primitive::) to position the file descriptor correctly for the
writing, as opposed to the lseek functionality used in
aio_write.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is available under the name aio_write and so
transparently replaces the interface for small files on 32 bit
machines.
Besides these functions with the more or less traditional interface,
POSIX.1b also defines a function which can initiate more than one
operation at a time, and which can handle freely mixed read and write
operations. It is therefore similar to a combination of readv and
writev.
-- Function: int lio_listio (int MODE, struct aiocb *const LIST[], int
NENT, struct sigevent *SIG)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
The lio_listio function can be used to enqueue an arbitrary
number of read and write requests at one time. The requests can
all be meant for the same file, all for different files or every
solution in between.
lio_listio gets the NENT requests from the array pointed to by
LIST. The operation to be performed is determined by the
aio_lio_opcode member in each element of LIST. If this field is
LIO_READ a read operation is enqueued, similar to a call of
aio_read for this element of the array (except that the way the
termination is signalled is different, as we will see below). If
the aio_lio_opcode member is LIO_WRITE a write operation is
enqueued. Otherwise the aio_lio_opcode must be LIO_NOP in
which case this element of LIST is simply ignored. This
“operation” is useful in situations where one has a fixed array of
struct aiocb elements from which only a few need to be handled at
a time. Another situation is where the lio_listio call was
canceled before all requests are processed (*note Cancel AIO
Operations::) and the remaining requests have to be reissued.
The other members of each element of the array pointed to by list
must have values suitable for the operation as described in the
documentation for aio_read and aio_write above.
The MODE argument determines how lio_listio behaves after having
enqueued all the requests. If MODE is LIO_WAIT it waits until
all requests terminated. Otherwise MODE must be LIO_NOWAIT and
in this case the function returns immediately after having enqueued
all the requests. In this case the caller gets a notification of
the termination of all requests according to the SIG parameter. If
SIG is NULL no notification is sent. Otherwise a signal is sent
or a thread is started, just as described in the description for
aio_read or aio_write.
If MODE is LIO_WAIT, the return value of lio_listio is 0 when
all requests completed successfully. Otherwise the function
returns -1 and errno is set accordingly. To find out which
request or requests failed one has to use the aio_error function
on all the elements of the array LIST.
In case MODE is LIO_NOWAIT, the function returns 0 if all
requests were enqueued correctly. The current state of the
requests can be found using aio_error and aio_return as
described above. If lio_listio returns -1 in this mode, the
global variable errno is set accordingly. If a request did not
yet terminate, a call to aio_error returns EINPROGRESS. If the
value is different, the request is finished and the error value (or
0) is returned and the result of the operation can be retrieved
using aio_return.
Possible values for errno are:
EAGAIN
The resources necessary to queue all the requests are not
available at the moment. The error status for each element of
LIST must be checked to determine which request failed.
Another reason could be that the system wide limit of AIO
requests is exceeded. This cannot be the case for the
implementation on GNU systems since no arbitrary limits exist.
EINVAL
The MODE parameter is invalid or NENT is larger than
AIO_LISTIO_MAX.
EIO
One or more of the requests I/O operations failed. The error
status of each request should be checked to determine which
one failed.
ENOSYS
The lio_listio function is not supported.
If the MODE parameter is LIO_NOWAIT and the caller cancels a
request, the error status for this request returned by aio_error
is ECANCELED.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is in fact lio_listio64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int lio_listio64 (int MODE, struct aiocb64 *const LIST[],
int NENT, struct sigevent *SIG)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function is similar to the lio_listio function. The only
difference is that on 32 bit machines, the file descriptor should
be opened in the large file mode. Internally, lio_listio64 uses
functionality equivalent to lseek64 (*note File Position
Primitive::) to position the file descriptor correctly for the
reading or writing, as opposed to the lseek functionality used in
lio_listio.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is available under the name lio_listio and so
transparently replaces the interface for small files on 32 bit
machines.

File: libc.info, Node: Status of AIO Operations, Next: Synchronizing AIO Operations, Prev: Asynchronous Reads/Writes, Up: Asynchronous I/O
13.11.2 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 an
I/O request. When the operation is performed truly asynchronously (as
with aio_read and aio_write and with lio_listio when the mode is
LIO_NOWAIT), one sometimes needs to know whether a specific request
already terminated and if so, what the result was. The following two
functions allow you to get this kind of information.
-- Function: int aio_error (const struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function determines the error state of the request described
by the struct aiocb variable pointed to by AIOCBP. If the
request has not yet terminated the value returned is always
EINPROGRESS. Once the request has terminated the value
aio_error returns is either 0 if the request completed
successfully or it returns the value which would be stored in the
errno variable if the request would have been done using read,
write, or fsync.
The function can return ENOSYS if it is not implemented. It
could also return EINVAL if the AIOCBP parameter does not refer
to an asynchronous operation whose return status is not yet known.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact aio_error64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_error64 (const struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is similar to aio_error with the only difference
that the argument is a reference to a variable of type struct
aiocb64.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name aio_error and so
transparently replaces the interface for small files on 32 bit
machines.
-- Function: ssize_t aio_return (struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function can be used to retrieve the return status of the
operation carried out by the request described in the variable
pointed to by AIOCBP. As long as the error status of this request
as returned by aio_error is EINPROGRESS the return value of
this function is undefined.
Once the request is finished this function can be used exactly once
to retrieve the return value. Following calls might lead to
undefined behavior. The return value itself is the value which
would have been returned by the read, write, or fsync call.
The function can return ENOSYS if it is not implemented. It
could also return EINVAL if the AIOCBP parameter does not refer
to an asynchronous operation whose return status is not yet known.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact aio_return64 since the LFS interface
transparently replaces the normal implementation.
-- Function: ssize_t aio_return64 (struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is similar to aio_return with the only difference
that the argument is a reference to a variable of type struct
aiocb64.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name aio_return and so
transparently replaces the interface for small files on 32 bit
machines.

File: libc.info, Node: Synchronizing AIO Operations, Next: Cancel AIO Operations, Prev: Status of AIO Operations, Up: Asynchronous I/O
13.11.3 Getting into a Consistent State
---------------------------------------
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 requests 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
resources (mainly computation time). Instead POSIX.1b defines two
functions which will help with most kinds of consistency.
The aio_fsync and aio_fsync64 functions are only available if the
symbol _POSIX_SYNCHRONIZED_IO is defined in unistd.h.
-- Function: int aio_fsync (int OP, struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
Calling this function forces all I/O operations queued at the time
of the function call operating on the file descriptor
aiocbp->aio_fildes into the synchronized I/O completion state
(*note Synchronizing I/O::). The aio_fsync function returns
immediately but the notification through the method described in
aiocbp->aio_sigevent will happen only after all requests for this
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 affected.
If OP is O_DSYNC the synchronization happens as with a call to
fdatasync. Otherwise OP should be O_SYNC and the
synchronization happens as with fsync.
As long as the synchronization has not happened, a call to
aio_error with the reference to the object pointed to by AIOCBP
returns EINPROGRESS. Once the synchronization is done
aio_error return 0 if the synchronization was not successful.
Otherwise the value returned is the value to which the fsync or
fdatasync function would have set the errno variable. In this
case nothing can be assumed about the consistency of the data
written to this file descriptor.
The return value of this function is 0 if the request was
successfully enqueued. Otherwise the return value is -1 and
errno is set to one of the following values:
EAGAIN
The request could not be enqueued due to temporary lack of
resources.
EBADF
The file descriptor AIOCBP->aio_fildes is not valid.
EINVAL
The implementation does not support I/O synchronization or the
OP parameter is other than O_DSYNC and O_SYNC.
ENOSYS
This function is not implemented.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact aio_fsync64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_fsync64 (int OP, struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function is similar to aio_fsync with the only difference
that the argument is a reference to a variable of type struct
aiocb64.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name aio_fsync and so
transparently replaces the interface for small files on 32 bit
machines.
Another method of synchronization is to wait until one or more
requests of a specific set terminated. This could be achieved by the
aio_* functions to notify the initiating process about the termination
but in some situations this is not the ideal solution. In a program
which constantly updates clients somehow connected to the server it is
not always the best solution to go round robin since some connections
might be slow. On the other hand letting the aio_* functions notify
the caller might also be not the best solution since whenever the
process works on preparing data for a client it makes no sense to be
interrupted by a notification since the new client will not be handled
before the current client is served. For situations like this
aio_suspend should be used.
-- Function: int aio_suspend (const struct aiocb *const LIST[], int
NENT, const struct timespec *TIMEOUT)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
When calling this function, the calling thread is suspended until
at least one of the requests pointed to by the NENT elements of the
array LIST has completed. If any of the requests has already
completed at the time aio_suspend is called, the function returns
immediately. Whether a request has terminated or not is determined
by comparing the error status of the request with EINPROGRESS.
If an element of LIST is NULL, the entry is simply ignored.
If no request has finished, the calling process is suspended. If
TIMEOUT is NULL, the process is not woken until a request has
finished. If TIMEOUT is not NULL, the process remains suspended
at least as long as specified in TIMEOUT. In this case,
aio_suspend returns with an error.
The return value of the function is 0 if one or more requests from
the LIST have terminated. Otherwise the function returns -1 and
errno is set to one of the following values:
EAGAIN
None of the requests from the LIST completed in the time
specified by TIMEOUT.
EINTR
A signal interrupted the aio_suspend function. This signal
might also be sent by the AIO implementation while signalling
the termination of one of the requests.
ENOSYS
The aio_suspend function is not implemented.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact aio_suspend64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_suspend64 (const struct aiocb64 *const LIST[], int
NENT, const struct timespec *TIMEOUT)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
This function is similar to aio_suspend with the only difference
that the argument is a reference to a variable of type struct
aiocb64.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name aio_suspend and so
transparently replaces the interface for small files on 32 bit
machines.

File: libc.info, Node: Cancel AIO Operations, Next: Configuration of AIO, Prev: Synchronizing AIO Operations, Up: Asynchronous I/O
13.11.4 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
becomes obvious that the written data is no longer accurate and would
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 of forcing 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.
-- Function: int aio_cancel (int FILDES, struct aiocb *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
The aio_cancel function can be used to cancel one or more
outstanding requests. If the AIOCBP parameter is NULL, the
function tries to cancel all of the outstanding requests which
would process the file descriptor FILDES (i.e., whose aio_fildes
member is FILDES). If AIOCBP is not NULL, aio_cancel attempts
to cancel the specific request pointed to by AIOCBP.
For requests which were successfully canceled, the normal
notification about the termination of the request should take
place. I.e., depending on the 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 the operation.
After a request is successfully canceled, a call to aio_error
with a reference to this request as the parameter will return
ECANCELED and a call to aio_return will return -1. If the
request wasnt canceled and is still running the error status is
still EINPROGRESS.
The return value of the function is AIO_CANCELED if there were
requests which havent terminated and which were successfully
canceled. If there is one or more requests left which couldnt be
canceled, the return value is AIO_NOTCANCELED. In this case
aio_error must be used to find out which of the, perhaps
multiple, requests (if AIOCBP is NULL) werent successfully
canceled. If all requests already terminated at the time
aio_cancel is called the return value is AIO_ALLDONE.
If an error occurred during the execution of aio_cancel the
function returns -1 and sets errno to one of the following
values.
EBADF
The file descriptor FILDES is not valid.
ENOSYS
aio_cancel is not implemented.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is in fact aio_cancel64 since the LFS interface
transparently replaces the normal implementation.
-- Function: int aio_cancel64 (int FILDES, struct aiocb64 *AIOCBP)
Preliminary: | MT-Safe | AS-Unsafe lock heap | AC-Unsafe lock mem |
*Note POSIX Safety Concepts::.
This function is similar to aio_cancel with the only difference
that the argument is a reference to a variable of type struct
aiocb64.
When the sources are compiled with _FILE_OFFSET_BITS == 64, this
function is available under the name aio_cancel and so
transparently replaces the interface for small files on 32 bit
machines.

File: libc.info, Node: Configuration of AIO, Prev: Cancel AIO Operations, Up: Asynchronous I/O
13.11.5 How to optimize the AIO implementation
----------------------------------------------
The POSIX standard does not specify how the AIO functions are
implemented. They could be system calls, but it is also possible to
emulate them at userlevel.
At the time of writing, the available implementation is a user-level
implementation which uses threads for handling the enqueued requests.
While this implementation requires making some decisions about
limitations, hard limitations are something best avoided in the GNU C
Library. Therefore, the GNU C Library provides a means for tuning the
AIO implementation according to the individual use.
-- Data Type: struct aioinit
This data type is used to pass the configuration or tunable
parameters to the implementation. The program has to initialize
the members of this struct and pass it to the implementation using
the aio_init function.
int aio_threads
This member specifies the maximal number of threads which may
be used at any one time.
int aio_num
This number provides an estimate on the maximal number of
simultaneously enqueued requests.
int aio_locks
Unused.
int aio_usedba
Unused.
int aio_debug
Unused.
int aio_numusers
Unused.
int aio_reserved[2]
Unused.
-- Function: void aio_init (const struct aioinit *INIT)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
This function must be called before any other AIO function.
Calling it is completely voluntary, as it is only meant to help the
AIO implementation perform better.
Before calling aio_init, the members of a variable of type
struct aioinit must be initialized. Then a reference to this
variable is passed as the parameter to aio_init which itself may
or may not pay attention to the hints.
The function has no return value and no error cases are defined.
It is an extension which follows a proposal from the SGI
implementation in Irix 6. It is not covered by POSIX.1b or Unix98.

File: libc.info, Node: Control Operations, Next: Duplicating Descriptors, Prev: Asynchronous I/O, Up: Low-Level I/O
13.12 Control Operations on Files
=================================
This section describes how you can perform various other operations on
file descriptors, such as inquiring about or setting flags describing
the status of the file descriptor, manipulating record locks, and the
like. All of these operations are performed by the function fcntl.
The second argument to the fcntl function is a command that
specifies which operation to perform. The function and macros that name
various flags that are used with it are declared in the header file
fcntl.h. Many of these flags are also used by the open function;
see *note Opening and Closing Files::.
-- Function: int fcntl (int FILEDES, int COMMAND, ...)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The fcntl function performs the operation specified by COMMAND on
the file descriptor FILEDES. Some commands require additional
arguments to be supplied. These additional arguments and the
return value and error conditions are given in the detailed
descriptions of the individual commands.
Briefly, here is a list of what the various commands are.
F_DUPFD
Duplicate the file descriptor (return another file descriptor
pointing to the same open file). *Note Duplicating
Descriptors::.
F_GETFD
Get flags associated with the file descriptor. *Note
Descriptor Flags::.
F_SETFD
Set flags associated with the file descriptor. *Note
Descriptor Flags::.
F_GETFL
Get flags associated with the open file. *Note File Status
Flags::.
F_SETFL
Set flags associated with the open file. *Note File Status
Flags::.
F_GETLK
Test a file lock. *Note File Locks::.
F_SETLK
Set or clear a file lock. *Note File Locks::.
F_SETLKW
Like F_SETLK, but wait for completion. *Note File Locks::.
F_OFD_GETLK
Test an open file description lock. *Note Open File
Description Locks::. Specific to Linux.
F_OFD_SETLK
Set or clear an open file description lock. *Note Open File
Description Locks::. Specific to Linux.
F_OFD_SETLKW
Like F_OFD_SETLK, but block until lock is acquired. *Note
Open File Description Locks::. Specific to Linux.
F_GETOWN
Get process or process group ID to receive SIGIO signals.
*Note Interrupt Input::.
F_SETOWN
Set process or process group ID to receive SIGIO signals.
*Note Interrupt Input::.
This function is a cancellation point in multi-threaded programs
for the commands F_SETLKW (and the LFS analogous F_SETLKW64)
and F_OFD_SETLKW. This is a problem if the thread allocates some
resources (like memory, file descriptors, semaphores or whatever)
at the time fcntl is called. If the thread gets canceled these
resources stay allocated until the program ends. To avoid this
calls to fcntl should be protected using cancellation handlers.

File: libc.info, Node: Duplicating Descriptors, Next: Descriptor Flags, Prev: Control Operations, Up: Low-Level I/O
13.13 Duplicating Descriptors
=============================
You can “duplicate” a file descriptor, or allocate another file
descriptor that refers to the same open file as the original. Duplicate
descriptors share one file position and one set of file status flags
(*note File Status Flags::), but each has its own set of file descriptor
flags (*note Descriptor Flags::).
The major use of duplicating a file descriptor is to implement
“redirection” of input or output: that is, to change the file or pipe
that a particular file descriptor corresponds to.
You can perform this operation using the fcntl function with the
F_DUPFD command, but there are also convenient functions dup and
dup2 for duplicating descriptors.
The fcntl function and flags are declared in fcntl.h, while
prototypes for dup and dup2 are in the header file unistd.h.
-- Function: int dup (int OLD)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function copies descriptor OLD to the first available
descriptor number (the first number not currently open). It is
equivalent to fcntl (OLD, F_DUPFD, 0).
-- Function: int dup2 (int OLD, int NEW)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function copies the descriptor OLD to descriptor number NEW.
If OLD is an invalid descriptor, then dup2 does nothing; it does
not close NEW. Otherwise, the new duplicate of OLD replaces any
previous meaning of descriptor NEW, as if NEW were closed first.
If OLD and NEW are different numbers, and OLD is a valid descriptor
number, then dup2 is equivalent to:
close (NEW);
fcntl (OLD, F_DUPFD, NEW)
However, dup2 does this atomically; there is no instant in the
middle of calling dup2 at which NEW is closed and not yet a
duplicate of OLD.
-- Macro: int F_DUPFD
This macro is used as the COMMAND argument to fcntl, to copy the
file descriptor given as the first argument.
The form of the call in this case is:
fcntl (OLD, F_DUPFD, NEXT-FILEDES)
The NEXT-FILEDES argument is of type int and specifies that the
file descriptor returned should be the next available one greater
than or equal to this value.
The return value from fcntl with this command is normally the
value of the new file descriptor. A return value of -1 indicates
an error. The following errno error conditions are defined for
this command:
EBADF
The OLD argument is invalid.
EINVAL
The NEXT-FILEDES argument is invalid.
EMFILE
There are no more file descriptors available—your program is
already using the maximum. In BSD and GNU, the maximum is
controlled by a resource limit that can be changed; *note
Limits on Resources::, for more information about the
RLIMIT_NOFILE limit.
ENFILE is not a possible error code for dup2 because dup2
does not create a new opening of a file; duplicate descriptors do
not count toward the limit which ENFILE indicates. EMFILE is
possible because it refers to the limit on distinct descriptor
numbers in use in one process.
Here is an example showing how to use dup2 to do redirection.
Typically, redirection of the standard streams (like stdin) is done by
a shell or shell-like program before calling one of the exec functions
(*note Executing a File::) to execute a new program in a child process.
When the new program is executed, it creates and initializes the
standard streams to point to the corresponding file descriptors, before
its main function is invoked.
So, to redirect standard input to a file, the shell could do
something like:
pid = fork ();
if (pid == 0)
{
char *filename;
char *program;
int file;
...
file = TEMP_FAILURE_RETRY (open (filename, O_RDONLY));
dup2 (file, STDIN_FILENO);
TEMP_FAILURE_RETRY (close (file));
execv (program, NULL);
}
There is also a more detailed example showing how to implement
redirection in the context of a pipeline of processes in *note Launching
Jobs::.

File: libc.info, Node: Descriptor Flags, Next: File Status Flags, Prev: Duplicating Descriptors, Up: Low-Level I/O
13.14 File Descriptor Flags
===========================
“File descriptor flags” are miscellaneous attributes of a file
descriptor. These flags are associated with particular file
descriptors, so that if you have created duplicate file descriptors from
a single opening of a file, each descriptor has its own set of flags.
Currently there is just one file descriptor flag: FD_CLOEXEC, which
causes the descriptor to be closed if you use any of the exec...
functions (*note Executing a File::).
The symbols in this section are defined in the header file fcntl.h.
-- Macro: int F_GETFD
This macro is used as the COMMAND argument to fcntl, to specify
that it should return the file descriptor flags associated with the
FILEDES argument.
The normal return value from fcntl with this command is a
nonnegative number which can be interpreted as the bitwise OR of
the individual flags (except that currently there is only one flag
to use).
In case of an error, fcntl returns -1. The following errno
error conditions are defined for this command:
EBADF
The FILEDES argument is invalid.
-- Macro: int F_SETFD
This macro is used as the COMMAND argument to fcntl, to specify
that it should set the file descriptor flags associated with the
FILEDES argument. This requires a third int argument to specify
the new flags, so the form of the call is:
fcntl (FILEDES, F_SETFD, NEW-FLAGS)
The normal return value from fcntl with this command is an
unspecified value other than -1, which indicates an error. The
flags and error conditions are the same as for the F_GETFD
command.
The following macro is defined for use as a file descriptor flag with
the fcntl function. The value is an integer constant usable as a bit
mask value.
-- Macro: int FD_CLOEXEC
This flag specifies that the file descriptor should be closed when
an exec function is invoked; see *note Executing a File::. When
a file descriptor is allocated (as with open or dup), this bit
is initially cleared on the new file descriptor, meaning that
descriptor will survive into the new program after exec.
If you want to modify the file descriptor flags, you should get the
current flags with F_GETFD and modify the value. Dont assume that
the flags listed here are the only ones that are implemented; your
program may be run years from now and more flags may exist then. For
example, here is a function to set or clear the flag FD_CLOEXEC
without altering any other flags:
/* Set the FD_CLOEXEC flag of DESC if VALUE is nonzero,
or clear the flag if VALUE is 0.
Return 0 on success, or -1 on error with errno set. */
int
set_cloexec_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFD, 0);
/* If reading the flags failed, return error indication now. */
if (oldflags < 0)
return oldflags;
/* Set just the flag we want to set. */
if (value != 0)
oldflags |= FD_CLOEXEC;
else
oldflags &= ~FD_CLOEXEC;
/* Store modified flag word in the descriptor. */
return fcntl (desc, F_SETFD, oldflags);
}

File: libc.info, Node: File Status Flags, Next: File Locks, Prev: Descriptor Flags, Up: Low-Level I/O
13.15 File Status Flags
=======================
“File status flags” are used to specify attributes of the opening of a
file. Unlike the file descriptor flags discussed in *note Descriptor
Flags::, the file status flags are shared by duplicated file descriptors
resulting from a single opening of the file. The file status flags are
specified with the FLAGS argument to open; *note Opening and Closing
Files::.
File status flags fall into three categories, which are described in
the following sections.
• *note Access Modes::, specify what type of access is allowed to the
file: reading, writing, or both. They are set by open and are
returned by fcntl, but cannot be changed.
• *note Open-time Flags::, control details of what open will do.
These flags are not preserved after the open call.
• *note Operating Modes::, affect how operations such as read and
write are done. They are set by open, and can be fetched or
changed with fcntl.
The symbols in this section are defined in the header file fcntl.h.
* Menu:
* Access Modes:: Whether the descriptor can read or write.
* Open-time Flags:: Details of open.
* Operating Modes:: Special modes to control I/O operations.
* Getting File Status Flags:: Fetching and changing these flags.

File: libc.info, Node: Access Modes, Next: Open-time Flags, Up: File Status Flags
13.15.1 File Access Modes
-------------------------
The file access modes allow a file descriptor to be used for reading,
writing, or both. (On GNU/Hurd systems, they can also allow none of
these, and allow execution of the file as a program.) The access modes
are chosen when the file is opened, and never change.
-- Macro: int O_RDONLY
Open the file for read access.
-- Macro: int O_WRONLY
Open the file for write access.
-- Macro: int O_RDWR
Open the file for both reading and writing.
On GNU/Hurd systems (and not on other systems), O_RDONLY and
O_WRONLY are independent bits that can be bitwise-ORed together, and
it is valid for either bit to be set or clear. This means that O_RDWR
is the same as O_RDONLY|O_WRONLY. A file access mode of zero is
permissible; it allows no operations that do input or output to the
file, but does allow other operations such as fchmod. On GNU/Hurd
systems, since “read-only” or “write-only” is a misnomer, fcntl.h
defines additional names for the file access modes. These names are
preferred when writing GNU-specific code. But most programs will want
to be portable to other POSIX.1 systems and should use the POSIX.1 names
above instead.
-- Macro: int O_READ
Open the file for reading. Same as O_RDONLY; only defined on
GNU.
-- Macro: int O_WRITE
Open the file for writing. Same as O_WRONLY; only defined on
GNU.
-- Macro: int O_EXEC
Open the file for executing. Only defined on GNU.
To determine the file access mode with fcntl, you must extract the
access mode bits from the retrieved file status flags. On GNU/Hurd
systems, you can just test the O_READ and O_WRITE bits in the flags
word. But in other POSIX.1 systems, reading and writing access modes
are not stored as distinct bit flags. The portable way to extract the
file access mode bits is with O_ACCMODE.
-- Macro: int O_ACCMODE
This macro stands for a mask that can be bitwise-ANDed with the
file status flag value to produce a value representing the file
access mode. The mode will be O_RDONLY, O_WRONLY, or O_RDWR.
(On GNU/Hurd systems it could also be zero, and it never includes
the O_EXEC bit.)

File: libc.info, Node: Open-time Flags, Next: Operating Modes, Prev: Access Modes, Up: File Status Flags
13.15.2 Open-time Flags
-----------------------
The open-time flags specify options affecting how open will behave.
These options are not preserved once the file is open. The exception to
this is O_NONBLOCK, which is also an I/O operating mode and so it _is_
saved. *Note Opening and Closing Files::, for how to call open.
There are two sorts of options specified by open-time flags.
• “File name translation flags” affect how open looks up the file
name to locate the file, and whether the file can be created.
• “Open-time action flags” specify extra operations that open will
perform on the file once it is open.
Here are the file name translation flags.
-- Macro: int O_CREAT
If set, the file will be created if it doesnt already exist.
-- Macro: int O_EXCL
If both O_CREAT and O_EXCL are set, then open fails if the
specified file already exists. This is guaranteed to never clobber
an existing file.
The O_EXCL flag has a special meaning in combination with
O_TMPFILE; see below.
-- Macro: int O_TMPFILE
If this flag is specified, functions in the open family create an
unnamed temporary file. In this case, the pathname argument to the
open family of functions (*note Opening and Closing Files::) is
interpreted as the directory in which the temporary file is created
(thus determining the file system which provides the storage for
the file). The O_TMPFILE flag must be combined with O_WRONLY
or O_RDWR, and the MODE argument is required.
The temporary file can later be given a name using linkat,
turning it into a regular file. This allows the atomic creation of
a file with the specific file attributes (mode and extended
attributes) and file contents. If, for security reasons, it is not
desirable that a name can be given to the file, the O_EXCL flag
can be specified along with O_TMPFILE.
Not all kernels support this open flag. If this flag is
unsupported, an attempt to create an unnamed temporary file fails
with an error of EINVAL. If the underlying file system does not
support the O_TMPFILE flag, an EOPNOTSUPP error is the result.
The O_TMPFILE flag is a GNU extension.
-- Macro: int O_NONBLOCK
This prevents open from blocking for a “long time” to open the
file. This is only meaningful for some kinds of files, usually
devices such as serial ports; when it is not meaningful, it is
harmless and ignored. Often, opening a port to a modem blocks
until the modem reports carrier detection; if O_NONBLOCK is
specified, open will return immediately without a carrier.
Note that the O_NONBLOCK flag is overloaded as both an I/O
operating mode and a file name translation flag. This means that
specifying O_NONBLOCK in open also sets nonblocking I/O mode;
*note Operating Modes::. To open the file without blocking but do
normal I/O that blocks, you must call open with O_NONBLOCK set
and then call fcntl to turn the bit off.
-- Macro: int O_NOCTTY
If the named file is a terminal device, dont make it the
controlling terminal for the process. *Note Job Control::, for
information about what it means to be the controlling terminal.
On GNU/Hurd systems and 4.4 BSD, opening a file never makes it the
controlling terminal and O_NOCTTY is zero. However, GNU/Linux
systems and some other systems use a nonzero value for O_NOCTTY
and set the controlling terminal when you open a file that is a
terminal device; so to be portable, use O_NOCTTY when it is
important to avoid this.
The following three file name translation flags exist only on
GNU/Hurd systems.
-- Macro: int O_IGNORE_CTTY
Do not recognize the named file as the controlling terminal, even
if it refers to the processs existing controlling terminal device.
Operations on the new file descriptor will never induce job control
signals. *Note Job Control::.
-- Macro: int O_NOLINK
If the named file is a symbolic link, open the link itself instead
of the file it refers to. (fstat on the new file descriptor will
return the information returned by lstat on the links name.)
-- Macro: int O_NOTRANS
If the named file is specially translated, do not invoke the
translator. Open the bare file the translator itself sees.
The open-time action flags tell open to do additional operations
which are not really related to opening the file. The reason to do them
as part of open instead of in separate calls is that open can do
them atomically.
-- Macro: int O_TRUNC
Truncate the file to zero length. This option is only useful for
regular files, not special files such as directories or FIFOs.
POSIX.1 requires that you open the file for writing to use
O_TRUNC. In BSD and GNU you must have permission to write the
file to truncate it, but you need not open for write access.
This is the only open-time action flag specified by POSIX.1. There
is no good reason for truncation to be done by open, instead of
by calling ftruncate afterwards. The O_TRUNC flag existed in
Unix before ftruncate was invented, and is retained for backward
compatibility.
The remaining operating modes are BSD extensions. They exist only on
some systems. On other systems, these macros are not defined.
-- Macro: int O_SHLOCK
Acquire a shared lock on the file, as with flock. *Note File
Locks::.
If O_CREAT is specified, the locking is done atomically when
creating the file. You are guaranteed that no other process will
get the lock on the new file first.
-- Macro: int O_EXLOCK
Acquire an exclusive lock on the file, as with flock. *Note File
Locks::. This is atomic like O_SHLOCK.

File: libc.info, Node: Operating Modes, Next: Getting File Status Flags, Prev: Open-time Flags, Up: File Status Flags
13.15.3 I/O Operating Modes
---------------------------
The operating modes affect how input and output operations using a file
descriptor work. These flags are set by open and can be fetched and
changed with fcntl.
-- Macro: int O_APPEND
The bit that enables append mode for the file. If set, then all
write operations write the data at the end of the file, extending
it, regardless of the current file position. This is the only
reliable way to append to a file. In append mode, you are
guaranteed that the data you write will always go to the current
end of the file, regardless of other processes writing to the file.
Conversely, if you simply set the file position to the end of file
and write, then another process can extend the file after you set
the file position but before you write, resulting in your data
appearing someplace before the real end of file.
-- Macro: int O_NONBLOCK
The bit that enables nonblocking mode for the file. If this bit is
set, read requests on the file can return immediately with a
failure status if there is no input immediately available, instead
of blocking. Likewise, write requests can also return
immediately with a failure status if the output cant be written
immediately.
Note that the O_NONBLOCK flag is overloaded as both an I/O
operating mode and a file name translation flag; *note Open-time
Flags::.
-- Macro: int O_NDELAY
This is an obsolete name for O_NONBLOCK, provided for
compatibility with BSD. It is not defined by the POSIX.1 standard.
The remaining operating modes are BSD and GNU extensions. They exist
only on some systems. On other systems, these macros are not defined.
-- Macro: int O_ASYNC
The bit that enables asynchronous input mode. If set, then SIGIO
signals will be generated when input is available. *Note Interrupt
Input::.
Asynchronous input mode is a BSD feature.
-- Macro: int O_FSYNC
The bit that enables synchronous writing for the file. If set,
each write call will make sure the data is reliably stored on
disk before returning.
Synchronous writing is a BSD feature.
-- Macro: int O_SYNC
This is another name for O_FSYNC. They have the same value.
-- Macro: int O_NOATIME
If this bit is set, read will not update the access time of the
file. *Note File Times::. This is used by programs that do
backups, so that backing a file up does not count as reading it.
Only the owner of the file or the superuser may use this bit.
This is a GNU extension.

File: libc.info, Node: Getting File Status Flags, Prev: Operating Modes, Up: File Status Flags
13.15.4 Getting and Setting File Status Flags
---------------------------------------------
The fcntl function can fetch or change file status flags.
-- Macro: int F_GETFL
This macro is used as the COMMAND argument to fcntl, to read the
file status flags for the open file with descriptor FILEDES.
The normal return value from fcntl with this command is a
nonnegative number which can be interpreted as the bitwise OR of
the individual flags. Since the file access modes are not
single-bit values, you can mask off other bits in the returned
flags with O_ACCMODE to compare them.
In case of an error, fcntl returns -1. The following errno
error conditions are defined for this command:
EBADF
The FILEDES argument is invalid.
-- Macro: int F_SETFL
This macro is used as the COMMAND argument to fcntl, to set the
file status flags for the open file corresponding to the FILEDES
argument. This command requires a third int argument to specify
the new flags, so the call looks like this:
fcntl (FILEDES, F_SETFL, NEW-FLAGS)
You cant change the access mode for the file in this way; that is,
whether the file descriptor was opened for reading or writing.
The normal return value from fcntl with this command is an
unspecified value other than -1, which indicates an error. The
error conditions are the same as for the F_GETFL command.
If you want to modify the file status flags, you should get the
current flags with F_GETFL and modify the value. Dont assume that
the flags listed here are the only ones that are implemented; your
program may be run years from now and more flags may exist then. For
example, here is a function to set or clear the flag O_NONBLOCK
without altering any other flags:
/* Set the O_NONBLOCK flag of DESC if VALUE is nonzero,
or clear the flag if VALUE is 0.
Return 0 on success, or -1 on error with errno set. */
int
set_nonblock_flag (int desc, int value)
{
int oldflags = fcntl (desc, F_GETFL, 0);
/* If reading the flags failed, return error indication now. */
if (oldflags == -1)
return -1;
/* Set just the flag we want to set. */
if (value != 0)
oldflags |= O_NONBLOCK;
else
oldflags &= ~O_NONBLOCK;
/* Store modified flag word in the descriptor. */
return fcntl (desc, F_SETFL, oldflags);
}

File: libc.info, Node: File Locks, Next: Open File Description Locks, Prev: File Status Flags, Up: Low-Level I/O
13.16 File Locks
================
This section describes record locks that are associated with the
process. There is also a different type of record lock that is
associated with the open file description instead of the process. *Note
Open File Description Locks::.
The remaining fcntl commands are used to support “record locking”,
which permits multiple cooperating programs to prevent each other from
simultaneously accessing parts of a file in error-prone ways.
An “exclusive” or “write” lock gives a process exclusive access for
writing to the specified part of the file. While a write lock is in
place, no other process can lock that part of the file.
A “shared” or “read” lock prohibits any other process from requesting
a write lock on the specified part of the file. However, other
processes can request read locks.
The read and write functions do not actually check to see whether
there are any locks in place. If you want to implement a locking
protocol for a file shared by multiple processes, your application must
do explicit fcntl calls to request and clear locks at the appropriate
points.
Locks are associated with processes. A process can only have one
kind of lock set for each byte of a given file. When any file
descriptor for that file is closed by the process, all of the locks that
process holds on that file are released, even if the locks were made
using other descriptors that remain open. Likewise, locks are released
when a process exits, and are not inherited by child processes created
using fork (*note Creating a Process::).
When making a lock, use a struct flock to specify what kind of lock
and where. This data type and the associated macros for the fcntl
function are declared in the header file fcntl.h.
-- Data Type: struct flock
This structure is used with the fcntl function to describe a file
lock. It has these members:
short int l_type
Specifies the type of the lock; one of F_RDLCK, F_WRLCK,
or F_UNLCK.
short int l_whence
This corresponds to the WHENCE argument to fseek or lseek,
and specifies what the offset is relative to. Its value can
be one of SEEK_SET, SEEK_CUR, or SEEK_END.
off_t l_start
This specifies the offset of the start of the region to which
the lock applies, and is given in bytes relative to the point
specified by the l_whence member.
off_t l_len
This specifies the length of the region to be locked. A value
of 0 is treated specially; it means the region extends to
the end of the file.
pid_t l_pid
This field is the process ID (*note Process Creation
Concepts::) of the process holding the lock. It is filled in
by calling fcntl with the F_GETLK command, but is ignored
when making a lock. If the conflicting lock is an open file
description lock (*note Open File Description Locks::), then
this field will be set to -1.
-- Macro: int F_GETLK
This macro is used as the COMMAND argument to fcntl, to specify
that it should get information about a lock. This command requires
a third argument of type struct flock * to be passed to fcntl,
so that the form of the call is:
fcntl (FILEDES, F_GETLK, LOCKP)
If there is a lock already in place that would block the lock
described by the LOCKP argument, information about that lock
overwrites *LOCKP. Existing locks are not reported if they are
compatible with making a new lock as specified. Thus, you should
specify a lock type of F_WRLCK if you want to find out about both
read and write locks, or F_RDLCK if you want to find out about
write locks only.
There might be more than one lock affecting the region specified by
the LOCKP argument, but fcntl only returns information about one
of them. The l_whence member of the LOCKP structure is set to
SEEK_SET and the l_start and l_len fields set to identify the
locked region.
If no lock applies, the only change to the LOCKP structure is to
update the l_type to a value of F_UNLCK.
The normal return value from fcntl with this command is an
unspecified value other than -1, which is reserved to indicate an
error. The following errno error conditions are defined for this
command:
EBADF
The FILEDES argument is invalid.
EINVAL
Either the LOCKP argument doesnt specify valid lock
information, or the file associated with FILEDES doesnt
support locks.
-- Macro: int F_SETLK
This macro is used as the COMMAND argument to fcntl, to specify
that it should set or clear a lock. This command requires a third
argument of type struct flock * to be passed to fcntl, so that
the form of the call is:
fcntl (FILEDES, F_SETLK, LOCKP)
If the process already has a lock on any part of the region, the
old lock on that part is replaced with the new lock. You can
remove a lock by specifying a lock type of F_UNLCK.
If the lock cannot be set, fcntl returns immediately with a value
of -1. This function does not block while waiting for other
processes to release locks. If fcntl succeeds, it returns a
value other than -1.
The following errno error conditions are defined for this
function:
EAGAIN
EACCES
The lock cannot be set because it is blocked by an existing
lock on the file. Some systems use EAGAIN in this case, and
other systems use EACCES; your program should treat them
alike, after F_SETLK. (GNU/Linux and GNU/Hurd systems
always use EAGAIN.)
EBADF
Either: the FILEDES argument is invalid; you requested a read
lock but the FILEDES is not open for read access; or, you
requested a write lock but the FILEDES is not open for write
access.
EINVAL
Either the LOCKP argument doesnt specify valid lock
information, or the file associated with FILEDES doesnt
support locks.
ENOLCK
The system has run out of file lock resources; there are
already too many file locks in place.
Well-designed file systems never report this error, because
they have no limitation on the number of locks. However, you
must still take account of the possibility of this error, as
it could result from network access to a file system on
another machine.
-- Macro: int F_SETLKW
This macro is used as the COMMAND argument to fcntl, to specify
that it should set or clear a lock. It is just like the F_SETLK
command, but causes the process to block (or wait) until the
request can be specified.
This command requires a third argument of type struct flock *, as
for the F_SETLK command.
The fcntl return values and errors are the same as for the
F_SETLK command, but these additional errno error conditions
are defined for this command:
EINTR
The function was interrupted by a signal while it was waiting.
*Note Interrupted Primitives::.
EDEADLK
The specified region is being locked by another process. But
that process is waiting to lock a region which the current
process has locked, so waiting for the lock would result in
deadlock. The system does not guarantee that it will detect
all such conditions, but it lets you know if it notices one.
The following macros are defined for use as values for the l_type
member of the flock structure. The values are integer constants.
F_RDLCK
This macro is used to specify a read (or shared) lock.
F_WRLCK
This macro is used to specify a write (or exclusive) lock.
F_UNLCK
This macro is used to specify that the region is unlocked.
As an example of a situation where file locking is useful, consider a
program that can be run simultaneously by several different users, that
logs status information to a common file. One example of such a program
might be a game that uses a file to keep track of high scores. Another
example might be a program that records usage or accounting information
for billing purposes.
Having multiple copies of the program simultaneously writing to the
file could cause the contents of the file to become mixed up. But you
can prevent this kind of problem by setting a write lock on the file
before actually writing to the file.
If the program also needs to read the file and wants to make sure
that the contents of the file are in a consistent state, then it can
also use a read lock. While the read lock is set, no other process can
lock that part of the file for writing.
Remember that file locks are only an _advisory_ protocol for
controlling access to a file. There is still potential for access to
the file by programs that dont use the lock protocol.

File: libc.info, Node: Open File Description Locks, Next: Open File Description Locks Example, Prev: File Locks, Up: Low-Level I/O
13.17 Open File Description Locks
=================================
In contrast to process-associated record locks (*note File Locks::),
open file description record locks are associated with an open file
description rather than a process.
Using fcntl to apply an open file description lock on a region that
already has an existing open file description lock that was created via
the same file descriptor will never cause a lock conflict.
Open file description locks are also inherited by child processes
across fork, or clone with CLONE_FILES set (*note Creating a
Process::), along with the file descriptor.
It is important to distinguish between the open file _description_
(an instance of an open file, usually created by a call to open) and
an open file _descriptor_, which is a numeric value that refers to the
open file description. The locks described here are associated with the
open file _description_ and not the open file _descriptor_.
Using dup (*note Duplicating Descriptors::) to copy a file
descriptor does not give you a new open file description, but rather
copies a reference to an existing open file description and assigns it
to a new file descriptor. Thus, open file description locks set on a
file descriptor cloned by dup will never conflict with open file
description locks set on the original descriptor since they refer to the
same open file description. Depending on the range and type of lock
involved, the original lock may be modified by a F_OFD_SETLK or
F_OFD_SETLKW command in this situation however.
Open file description locks always conflict with process-associated
locks, even if acquired by the same process or on the same open file
descriptor.
Open file description locks use the same struct flock as
process-associated locks as an argument (*note File Locks::) and the
macros for the command values are also declared in the header file
fcntl.h. To use them, the macro _GNU_SOURCE must be defined prior
to including any header file.
In contrast to process-associated locks, any struct flock used as
an argument to open file description lock commands must have the l_pid
value set to 0. Also, when returning information about an open file
description lock in a F_GETLK or F_OFD_GETLK request, the l_pid
field in struct flock will be set to -1 to indicate that the lock is
not associated with a process.
When the same struct flock is reused as an argument to a
F_OFD_SETLK or F_OFD_SETLKW request after being used for an
F_OFD_GETLK request, it is necessary to inspect and reset the l_pid
field to 0.
-- Macro: int F_OFD_GETLK
This macro is used as the COMMAND argument to fcntl, to specify
that it should get information about a lock. This command requires
a third argument of type struct flock * to be passed to fcntl,
so that the form of the call is:
fcntl (FILEDES, F_OFD_GETLK, LOCKP)
If there is a lock already in place that would block the lock
described by the LOCKP argument, information about that lock is
written to *LOCKP. Existing locks are not reported if they are
compatible with making a new lock as specified. Thus, you should
specify a lock type of F_WRLCK if you want to find out about both
read and write locks, or F_RDLCK if you want to find out about
write locks only.
There might be more than one lock affecting the region specified by
the LOCKP argument, but fcntl only returns information about one
of them. Which lock is returned in this situation is undefined.
The l_whence member of the LOCKP structure are set to SEEK_SET
and the l_start and l_len fields are set to identify the locked
region.
If no conflicting lock exists, the only change to the LOCKP
structure is to update the l_type field to the value F_UNLCK.
The normal return value from fcntl with this command is either 0
on success or -1, which indicates an error. The following errno
error conditions are defined for this command:
EBADF
The FILEDES argument is invalid.
EINVAL
Either the LOCKP argument doesnt specify valid lock
information, the operating system kernel doesnt support open
file description locks, or the file associated with FILEDES
doesnt support locks.
-- Macro: int F_OFD_SETLK
This macro is used as the COMMAND argument to fcntl, to specify
that it should set or clear a lock. This command requires a third
argument of type struct flock * to be passed to fcntl, so that
the form of the call is:
fcntl (FILEDES, F_OFD_SETLK, LOCKP)
If the open file already has a lock on any part of the region, the
old lock on that part is replaced with the new lock. You can
remove a lock by specifying a lock type of F_UNLCK.
If the lock cannot be set, fcntl returns immediately with a value
of -1. This command does not wait for other tasks to release
locks. If fcntl succeeds, it returns 0.
The following errno error conditions are defined for this
command:
EAGAIN
The lock cannot be set because it is blocked by an existing
lock on the file.
EBADF
Either: the FILEDES argument is invalid; you requested a read
lock but the FILEDES is not open for read access; or, you
requested a write lock but the FILEDES is not open for write
access.
EINVAL
Either the LOCKP argument doesnt specify valid lock
information, the operating system kernel doesnt support open
file description locks, or the file associated with FILEDES
doesnt support locks.
ENOLCK
The system has run out of file lock resources; there are
already too many file locks in place.
Well-designed file systems never report this error, because
they have no limitation on the number of locks. However, you
must still take account of the possibility of this error, as
it could result from network access to a file system on
another machine.
-- Macro: int F_OFD_SETLKW
This macro is used as the COMMAND argument to fcntl, to specify
that it should set or clear a lock. It is just like the
F_OFD_SETLK command, but causes the process to wait until the
request can be completed.
This command requires a third argument of type struct flock *, as
for the F_OFD_SETLK command.
The fcntl return values and errors are the same as for the
F_OFD_SETLK command, but these additional errno error
conditions are defined for this command:
EINTR
The function was interrupted by a signal while it was waiting.
*Note Interrupted Primitives::.
Open file description locks are useful in the same sorts of
situations as process-associated locks. They can also be used to
synchronize file access between threads within the same process by
having each thread perform its own open of the file, to obtain its own
open file description.
Because open file description locks are automatically freed only upon
closing the last file descriptor that refers to the open file
description, this locking mechanism avoids the possibility that locks
are inadvertently released due to a library routine opening and closing
a file without the application being aware.
As with process-associated locks, open file description locks are
advisory.

File: libc.info, Node: Open File Description Locks Example, Next: Interrupt Input, Prev: Open File Description Locks, Up: Low-Level I/O
13.18 Open File Description Locks Example
=========================================
Here is an example of using open file description locks in a threaded
program. If this program used process-associated locks, then it would
be subject to data corruption because process-associated locks are
shared by the threads inside a process, and thus cannot be used by one
thread to lock out another thread in the same process.
Proper error handling has been omitted in the following program for
brevity.
#define _GNU_SOURCE
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#define FILENAME "/tmp/foo"
#define NUM_THREADS 3
#define ITERATIONS 5
void *
thread_start (void *arg)
{
int i, fd, len;
long tid = (long) arg;
char buf[256];
struct flock lck = {
.l_whence = SEEK_SET,
.l_start = 0,
.l_len = 1,
};
fd = open ("/tmp/foo", O_RDWR | O_CREAT, 0666);
for (i = 0; i < ITERATIONS; i++)
{
lck.l_type = F_WRLCK;
fcntl (fd, F_OFD_SETLKW, &lck);
len = sprintf (buf, "%d: tid=%ld fd=%d\n", i, tid, fd);
lseek (fd, 0, SEEK_END);
write (fd, buf, len);
fsync (fd);
lck.l_type = F_UNLCK;
fcntl (fd, F_OFD_SETLK, &lck);
/* sleep to ensure lock is yielded to another thread */
usleep (1);
}
pthread_exit (NULL);
}
int
main (int argc, char **argv)
{
long i;
pthread_t threads[NUM_THREADS];
truncate (FILENAME, 0);
for (i = 0; i < NUM_THREADS; i++)
pthread_create (&threads[i], NULL, thread_start, (void *) i);
pthread_exit (NULL);
return 0;
}
This example creates three threads each of which loops five times,
appending to the file. Access to the file is serialized via open file
description locks. If we compile and run the above program, well end
up with /tmp/foo that has 15 lines in it.
If we, however, were to replace the F_OFD_SETLK and F_OFD_SETLKW
commands with their process-associated lock equivalents, the locking
essentially becomes a noop since it is all done within the context of
the same process. That leads to data corruption (typically manifested
as missing lines) as some threads race in and overwrite the data written
by others.

File: libc.info, Node: Interrupt Input, Next: IOCTLs, Prev: Open File Description Locks Example, Up: Low-Level I/O
13.19 Interrupt-Driven Input
============================
If you set the O_ASYNC status flag on a file descriptor (*note File
Status Flags::), a SIGIO signal is sent whenever input or output
becomes possible on that file descriptor. The process or process group
to receive the signal can be selected by using the F_SETOWN command to
the fcntl function. If the file descriptor is a socket, this also
selects the recipient of SIGURG signals that are delivered when
out-of-band data arrives on that socket; see *note Out-of-Band Data::.
(SIGURG is sent in any situation where select would report the
socket as having an “exceptional condition”. *Note Waiting for I/O::.)
If the file descriptor corresponds to a terminal device, then SIGIO
signals are sent to the foreground process group of the terminal. *Note
Job Control::.
The symbols in this section are defined in the header file fcntl.h.
-- Macro: int F_GETOWN
This macro is used as the COMMAND argument to fcntl, to specify
that it should get information about the process or process group
to which SIGIO signals are sent. (For a terminal, this is
actually the foreground process group ID, which you can get using
tcgetpgrp; see *note Terminal Access Functions::.)
The return value is interpreted as a process ID; if negative, its
absolute value is the process group ID.
The following errno error condition is defined for this command:
EBADF
The FILEDES argument is invalid.
-- Macro: int F_SETOWN
This macro is used as the COMMAND argument to fcntl, to specify
that it should set the process or process group to which SIGIO
signals are sent. This command requires a third argument of type
pid_t to be passed to fcntl, so that the form of the call is:
fcntl (FILEDES, F_SETOWN, PID)
The PID argument should be a process ID. You can also pass a
negative number whose absolute value is a process group ID.
The return value from fcntl with this command is -1 in case of
error and some other value if successful. The following errno
error conditions are defined for this command:
EBADF
The FILEDES argument is invalid.
ESRCH
There is no process or process group corresponding to PID.

File: libc.info, Node: IOCTLs, Prev: Interrupt Input, Up: Low-Level I/O
13.20 Generic I/O Control operations
====================================
GNU systems can handle most input/output operations on many different
devices and objects in terms of a few file primitives - read, write
and lseek. However, most devices also have a few peculiar operations
which do not fit into this model. Such as:
• Changing the character font used on a terminal.
• Telling a magnetic tape system to rewind or fast forward. (Since
they cannot move in byte increments, lseek is inapplicable).
• Ejecting a disk from a drive.
• Playing an audio track from a CD-ROM drive.
• Maintaining routing tables for a network.
Although some such objects such as sockets and terminals (1) have
special functions of their own, it would not be practical to create
functions for all these cases.
Instead these minor operations, known as “IOCTL”s, are assigned code
numbers and multiplexed through the ioctl function, defined in
sys/ioctl.h. The code numbers themselves are defined in many
different headers.
-- Function: int ioctl (int FILEDES, int COMMAND, ...)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The ioctl function performs the generic I/O operation COMMAND on
FILEDES.
A third argument is usually present, either a single number or a
pointer to a structure. The meaning of this argument, the returned
value, and any error codes depends upon the command used. Often -1
is returned for a failure.
On some systems, IOCTLs used by different devices share the same
numbers. Thus, although use of an inappropriate IOCTL _usually_ only
produces an error, you should not attempt to use device-specific IOCTLs
on an unknown device.
Most IOCTLs are OS-specific and/or only used in special system
utilities, and are thus beyond the scope of this document. For an
example of the use of an IOCTL, see *note Out-of-Band Data::.
---------- Footnotes ----------
(1) Actually, the terminal-specific functions are implemented with
IOCTLs on many platforms.

File: libc.info, Node: File System Interface, Next: Pipes and FIFOs, Prev: Low-Level I/O, Up: Top
14 File System Interface
************************
This chapter describes the GNU C Librarys functions for manipulating
files. Unlike the input and output functions (*note I/O on Streams::;
*note Low-Level I/O::), these functions are concerned with operating on
the files themselves rather than on their contents.
Among the facilities described in this chapter are functions for
examining or modifying directories, functions for renaming and deleting
files, and functions for examining and setting file attributes such as
access permissions and modification times.
* Menu:
* Working Directory:: This is used to resolve relative
file names.
* Accessing Directories:: Finding out what files a directory
contains.
* Working with Directory Trees:: Apply actions to all files or a selectable
subset of a directory hierarchy.
* Hard Links:: Adding alternate names to a file.
* Symbolic Links:: A file that “points to” a file name.
* Deleting Files:: How to delete a file, and what that means.
* Renaming Files:: Changing a files name.
* Creating Directories:: A system call just for creating a directory.
* File Attributes:: Attributes of individual files.
* Making Special Files:: How to create special files.
* Temporary Files:: Naming and creating temporary files.

File: libc.info, Node: Working Directory, Next: Accessing Directories, Up: File System Interface
14.1 Working Directory
======================
Each process has associated with it a directory, called its “current
working directory” or simply “working directory”, that is used in the
resolution of relative file names (*note File Name Resolution::).
When you log in and begin a new session, your working directory is
initially set to the home directory associated with your login account
in the system user database. You can find any users home directory
using the getpwuid or getpwnam functions; see *note User Database::.
Users can change the working directory using shell commands like
cd. The functions described in this section are the primitives used
by those commands and by other programs for examining and changing the
working directory.
Prototypes for these functions are declared in the header file
unistd.h.
-- Function: char * getcwd (char *BUFFER, size_t SIZE)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The getcwd function returns an absolute file name representing
the current working directory, storing it in the character array
BUFFER that you provide. The SIZE argument is how you tell the
system the allocation size of BUFFER.
The GNU C Library version of this function also permits you to
specify a null pointer for the BUFFER argument. Then getcwd
allocates a buffer automatically, as with malloc (*note
Unconstrained Allocation::). If the SIZE is greater than zero,
then the buffer is that large; otherwise, the buffer is as large as
necessary to hold the result.
The return value is BUFFER on success and a null pointer on
failure. The following errno error conditions are defined for
this function:
EINVAL
The SIZE argument is zero and BUFFER is not a null pointer.
ERANGE
The SIZE argument is less than the length of the working
directory name. You need to allocate a bigger array and try
again.
EACCES
Permission to read or search a component of the file name was
denied.
You could implement the behavior of GNUs getcwd (NULL, 0) using
only the standard behavior of getcwd:
char *
gnu_getcwd ()
{
size_t size = 100;
while (1)
{
char *buffer = (char *) xmalloc (size);
if (getcwd (buffer, size) == buffer)
return buffer;
free (buffer);
if (errno != ERANGE)
return 0;
size *= 2;
}
}
*Note Malloc Examples::, for information about xmalloc, which is not a
library function but is a customary name used in most GNU software.
-- Deprecated Function: char * getwd (char *BUFFER)
Preliminary: | MT-Safe | AS-Unsafe heap i18n | AC-Unsafe mem fd |
*Note POSIX Safety Concepts::.
This is similar to getcwd, but has no way to specify the size of
the buffer. The GNU C Library provides getwd only for backwards
compatibility with BSD.
The BUFFER argument should be a pointer to an array at least
PATH_MAX bytes long (*note Limits for Files::). On GNU/Hurd
systems there is no limit to the size of a file name, so this is
not necessarily enough space to contain the directory name. That
is why this function is deprecated.
-- Function: char * get_current_dir_name (void)
Preliminary: | MT-Safe env | AS-Unsafe heap | AC-Unsafe mem fd |
*Note POSIX Safety Concepts::.
The get_current_dir_name function is basically equivalent to
getcwd (NULL, 0), except the value of the PWD environment
variable is first examined, and if it does in fact correspond to
the current directory, that value is returned. This is a subtle
difference which is visible if the path described by the value in
PWD is using one or more symbolic links, in which case the value
returned by getcwd would resolve the symbolic links and therefore
yield a different result.
This function is a GNU extension.
-- Function: int chdir (const char *FILENAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is used to set the processs working directory to
FILENAME.
The normal, successful return value from chdir is 0. A value
of -1 is returned to indicate an error. The errno error
conditions defined for this function are the usual file name syntax
errors (*note File Name Errors::), plus ENOTDIR if the file
FILENAME is not a directory.
-- Function: int fchdir (int FILEDES)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is used to set the processs working directory to
directory associated with the file descriptor FILEDES.
The normal, successful return value from fchdir is 0. A value
of -1 is returned to indicate an error. The following errno
error conditions are defined for this function:
EACCES
Read permission is denied for the directory named by
dirname.
EBADF
The FILEDES argument is not a valid file descriptor.
ENOTDIR
The file descriptor FILEDES is not associated with a
directory.
EINTR
The function call was interrupt by a signal.
EIO
An I/O error occurred.

File: libc.info, Node: Accessing Directories, Next: Working with Directory Trees, Prev: Working Directory, Up: File System Interface
14.2 Accessing Directories
==========================
The facilities described in this section let you read the contents of a
directory file. This is useful if you want your program to list all the
files in a directory, perhaps as part of a menu.
The opendir function opens a “directory stream” whose elements are
directory entries. Alternatively fdopendir can be used which can have
advantages if the program needs to have more control over the way the
directory is opened for reading. This allows, for instance, to pass the
O_NOATIME flag to open.
You use the readdir function on the directory stream to retrieve
these entries, represented as struct dirent objects. The name of the
file for each entry is stored in the d_name member of this structure.
There are obvious parallels here to the stream facilities for ordinary
files, described in *note I/O on Streams::.
* Menu:
* Directory Entries:: Format of one directory entry.
* Opening a Directory:: How to open a directory stream.
* Reading/Closing Directory:: How to read directory entries from the stream.
* Simple Directory Lister:: A very simple directory listing program.
* Random Access Directory:: Rereading part of the directory
already read with the same stream.
* Scanning Directory Content:: Get entries for user selected subset of
contents in given directory.
* Simple Directory Lister Mark II:: Revised version of the program.

File: libc.info, Node: Directory Entries, Next: Opening a Directory, Up: Accessing Directories
14.2.1 Format of a Directory Entry
----------------------------------
This section describes what you find in a single directory entry, as you
might obtain it from a directory stream. All the symbols are declared
in the header file dirent.h.
-- Data Type: struct dirent
This is a structure type used to return information about directory
entries. It contains the following fields:
char d_name[]
This is the null-terminated file name component. This is the
only field you can count on in all POSIX systems.
ino_t d_fileno
This is the file serial number. For BSD compatibility, you
can also refer to this member as d_ino. On GNU/Linux and
GNU/Hurd systems and most POSIX systems, for most files this
the same as the st_ino member that stat will return for
the file. *Note File Attributes::.
unsigned char d_namlen
This is the length of the file name, not including the
terminating null character. Its type is unsigned char
because that is the integer type of the appropriate size.
This member is a BSD extension. The symbol
_DIRENT_HAVE_D_NAMLEN is defined if this member is
available.
unsigned char d_type
This is the type of the file, possibly unknown. The following
constants are defined for its value:
DT_UNKNOWN
The type is unknown. Only some filesystems have full
support to return the type of the file, others might
always return this value.
DT_REG
A regular file.
DT_DIR
A directory.
DT_FIFO
A named pipe, or FIFO. *Note FIFO Special Files::.
DT_SOCK
A local-domain socket.
DT_CHR
A character device.
DT_BLK
A block device.
DT_LNK
A symbolic link.
This member is a BSD extension. The symbol
_DIRENT_HAVE_D_TYPE is defined if this member is available.
On systems where it is used, it corresponds to the file type
bits in the st_mode member of struct stat. If the value
cannot be determined the member value is DT_UNKNOWN. These two
macros convert between d_type values and st_mode values:
-- Function: int IFTODT (mode_t MODE)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This returns the d_type value corresponding to MODE.
-- Function: mode_t DTTOIF (int DTYPE)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
This returns the st_mode value corresponding to DTYPE.
This structure may contain additional members in the future. Their
availability is always announced in the compilation environment by
a macro named _DIRENT_HAVE_D_XXX where XXX is replaced by the
name of the new member. For instance, the member d_reclen
available on some systems is announced through the macro
_DIRENT_HAVE_D_RECLEN.
When a file has multiple names, each name has its own directory
entry. The only way you can tell that the directory entries belong
to a single file is that they have the same value for the
d_fileno field.
File attributes such as size, modification times etc., are part of
the file itself, not of any particular directory entry. *Note File
Attributes::.

File: libc.info, Node: Opening a Directory, Next: Reading/Closing Directory, Prev: Directory Entries, Up: Accessing Directories
14.2.2 Opening a Directory Stream
---------------------------------
This section describes how to open a directory stream. All the symbols
are declared in the header file dirent.h.
-- Data Type: DIR
The DIR data type represents a directory stream.
You shouldnt ever allocate objects of the struct dirent or DIR
data types, since the directory access functions do that for you.
Instead, you refer to these objects using the pointers returned by the
following functions.
-- Function: DIR * opendir (const char *DIRNAME)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The opendir function opens and returns a directory stream for
reading the directory whose file name is DIRNAME. The stream has
type DIR *.
If unsuccessful, opendir returns a null pointer. In addition to
the usual file name errors (*note File Name Errors::), the
following errno error conditions are defined for this function:
EACCES
Read permission is denied for the directory named by
dirname.
EMFILE
The process has too many files open.
ENFILE
The entire system, or perhaps the file system which contains
the directory, cannot support any additional open files at the
moment. (This problem cannot happen on GNU/Hurd systems.)
ENOMEM
Not enough memory available.
The DIR type is typically implemented using a file descriptor,
and the opendir function in terms of the open function. *Note
Low-Level I/O::. Directory streams and the underlying file
descriptors are closed on exec (*note Executing a File::).
The directory which is opened for reading by opendir is identified
by the name. In some situations this is not sufficient. Or the way
opendir implicitly creates a file descriptor for the directory is not
the way a program might want it. In these cases an alternative
interface can be used.
-- Function: DIR * fdopendir (int FD)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The fdopendir function works just like opendir but instead of
taking a file name and opening a file descriptor for the directory
the caller is required to provide a file descriptor. This file
descriptor is then used in subsequent uses of the returned
directory stream object.
The caller must make sure the file descriptor is associated with a
directory and it allows reading.
If the fdopendir call returns successfully the file descriptor is
now under the control of the system. It can be used in the same
way the descriptor implicitly created by opendir can be used but
the program must not close the descriptor.
In case the function is unsuccessful it returns a null pointer and
the file descriptor remains to be usable by the program. The
following errno error conditions are defined for this function:
EBADF
The file descriptor is not valid.
ENOTDIR
The file descriptor is not associated with a directory.
EINVAL
The descriptor does not allow reading the directory content.
ENOMEM
Not enough memory available.
In some situations it can be desirable to get hold of the file
descriptor which is created by the opendir call. For instance, to
switch the current working directory to the directory just read the
fchdir function could be used. Historically the DIR type was
exposed and programs could access the fields. This does not happen in
the GNU C Library. Instead a separate function is provided to allow
access.
-- Function: int dirfd (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The function dirfd returns the file descriptor associated with
the directory stream DIRSTREAM. This descriptor can be used until
the directory is closed with closedir. If the directory stream
implementation is not using file descriptors the return value is
-1.

File: libc.info, Node: Reading/Closing Directory, Next: Simple Directory Lister, Prev: Opening a Directory, Up: Accessing Directories
14.2.3 Reading and Closing a Directory Stream
---------------------------------------------
This section describes how to read directory entries from a directory
stream, and how to close the stream when you are done with it. All the
symbols are declared in the header file dirent.h.
-- Function: struct dirent * readdir (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
This function reads the next entry from the directory. It normally
returns a pointer to a structure containing information about the
file. This structure is associated with the DIRSTREAM handle and
can be rewritten by a subsequent call.
*Portability Note:* On some systems readdir may not return
entries for . and .., even though these are always valid file
names in any directory. *Note File Name Resolution::.
If there are no more entries in the directory or an error is
detected, readdir returns a null pointer. The following errno
error conditions are defined for this function:
EBADF
The DIRSTREAM argument is not valid.
To distinguish between an end-of-directory condition or an error,
you must set errno to zero before calling readdir. To avoid
entering an infinite loop, you should stop reading from the
directory after the first error.
*Caution:* The pointer returned by readdir points to a buffer
within the DIR object. The data in that buffer will be
overwritten by the next call to readdir. You must take care, for
instance, to copy the d_name string if you need it later.
Because of this, it is not safe to share a DIR object among
multiple threads, unless you use your own locking to ensure that no
thread calls readdir while another thread is still using the data
from the previous call. In the GNU C Library, it is safe to call
readdir from multiple threads as long as each thread uses its own
DIR object. POSIX.1-2008 does not require this to be safe, but
we are not aware of any operating systems where it does not work.
readdir_r allows you to provide your own buffer for the struct
dirent, but it is less portable than readdir, and has problems
with very long filenames (see below). We recommend you use
readdir, but do not share DIR objects.
-- Function: int readdir_r (DIR *DIRSTREAM, struct dirent *ENTRY,
struct dirent **RESULT)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
This function is a version of readdir which performs internal
locking. Like readdir it returns the next entry from the
directory. To prevent conflicts between simultaneously running
threads the result is stored inside the ENTRY object.
*Portability Note:* readdir_r is deprecated. It is recommended
to use readdir instead of readdir_r for the following reasons:
• On systems which do not define NAME_MAX, it may not be
possible to use readdir_r safely because the caller does not
specify the length of the buffer for the directory entry.
• On some systems, readdir_r cannot read directory entries
with very long names. If such a name is encountered, the GNU
C Library implementation of readdir_r returns with an error
code of ENAMETOOLONG after the final directory entry has
been read. On other systems, readdir_r may return
successfully, but the d_name member may not be
NUL-terminated or may be truncated.
• POSIX-1.2008 does not guarantee that readdir is thread-safe,
even when access to the same DIRSTREAM is serialized. But in
current implementations (including the GNU C Library), it is
safe to call readdir concurrently on different DIRSTREAMs,
so there is no need to use readdir_r in most multi-threaded
programs. In the rare case that multiple threads need to read
from the same DIRSTREAM, it is still better to use readdir
and external synchronization.
• It is expected that future versions of POSIX will obsolete
readdir_r and mandate the level of thread safety for
readdir which is provided by the GNU C Library and other
implementations today.
Normally readdir_r returns zero and sets *RESULT to ENTRY. If
there are no more entries in the directory or an error is detected,
readdir_r sets *RESULT to a null pointer and returns a nonzero
error code, also stored in errno, as described for readdir.
It is also important to look at the definition of the struct
dirent type. Simply passing a pointer to an object of this type
for the second parameter of readdir_r might not be enough. Some
systems dont define the d_name element sufficiently long. In
this case the user has to provide additional space. There must be
room for at least NAME_MAX + 1 characters in the d_name array.
Code to call readdir_r could look like this:
union
{
struct dirent d;
char b[offsetof (struct dirent, d_name) + NAME_MAX + 1];
} u;
if (readdir_r (dir, &u.d, &res) == 0)
...
To support large filesystems on 32-bit machines there are LFS
variants of the last two functions.
-- Function: struct dirent64 * readdir64 (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
The readdir64 function is just like the readdir function except
that it returns a pointer to a record of type struct dirent64.
Some of the members of this data type (notably d_ino) might have
a different size to allow large filesystems.
In all other aspects this function is equivalent to readdir.
-- Function: int readdir64_r (DIR *DIRSTREAM, struct dirent64 *ENTRY,
struct dirent64 **RESULT)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
The deprecated readdir64_r function is equivalent to the
readdir_r function except that it takes parameters of base type
struct dirent64 instead of struct dirent in the second and
third position. The same precautions mentioned in the
documentation of readdir_r also apply here.
-- Function: int closedir (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Unsafe heap lock/hurd | AC-Unsafe mem
fd lock/hurd | *Note POSIX Safety Concepts::.
This function closes the directory stream DIRSTREAM. It returns
0 on success and -1 on failure.
The following errno error conditions are defined for this
function:
EBADF
The DIRSTREAM argument is not valid.

File: libc.info, Node: Simple Directory Lister, Next: Random Access Directory, Prev: Reading/Closing Directory, Up: Accessing Directories
14.2.4 Simple Program to List a Directory
-----------------------------------------
Heres a simple program that prints the names of the files in the
current working directory:
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
int
main (void)
{
DIR *dp;
struct dirent *ep;
dp = opendir ("./");
if (dp != NULL)
{
while (ep = readdir (dp))
puts (ep->d_name);
(void) closedir (dp);
}
else
perror ("Couldn't open the directory");
return 0;
}
The order in which files appear in a directory tends to be fairly
random. A more useful program would sort the entries (perhaps by
alphabetizing them) before printing them; see *note Scanning Directory
Content::, and *note Array Sort Function::.

File: libc.info, Node: Random Access Directory, Next: Scanning Directory Content, Prev: Simple Directory Lister, Up: Accessing Directories
14.2.5 Random Access in a Directory Stream
------------------------------------------
This section describes how to reread parts of a directory that you have
already read from an open directory stream. All the symbols are
declared in the header file dirent.h.
-- Function: void rewinddir (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | *Note
POSIX Safety Concepts::.
The rewinddir function is used to reinitialize the directory
stream DIRSTREAM, so that if you call readdir it returns
information about the first entry in the directory again. This
function also notices if files have been added or removed to the
directory since it was opened with opendir. (Entries for these
files might or might not be returned by readdir if they were
added or removed since you last called opendir or rewinddir.)
-- Function: long int telldir (DIR *DIRSTREAM)
Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
The telldir function returns the file position of the directory
stream DIRSTREAM. You can use this value with seekdir to restore
the directory stream to that position.
-- Function: void seekdir (DIR *DIRSTREAM, long int POS)
Preliminary: | MT-Safe | AS-Unsafe heap/bsd lock/bsd | AC-Unsafe
mem/bsd lock/bsd | *Note POSIX Safety Concepts::.
The seekdir function sets the file position of the directory
stream DIRSTREAM to POS. The value POS must be the result of a
previous call to telldir on this particular stream; closing and
reopening the directory can invalidate values returned by
telldir.

File: libc.info, Node: Scanning Directory Content, Next: Simple Directory Lister Mark II, Prev: Random Access Directory, Up: Accessing Directories
14.2.6 Scanning the Content of a Directory
------------------------------------------
A higher-level interface to the directory handling functions is the
scandir function. With its help one can select a subset of the
entries in a directory, possibly sort them and get a list of names as
the result.
-- Function: int scandir (const char *DIR, struct dirent ***NAMELIST,
int (*SELECTOR) (const struct dirent *), int (*CMP) (const
struct dirent **, const struct dirent **))
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The scandir function scans the contents of the directory selected
by DIR. The result in *NAMELIST is an array of pointers to
structures of type struct dirent which describe all selected
directory entries and which is allocated using malloc. Instead
of always getting all directory entries returned, the user supplied
function SELECTOR can be used to decide which entries are in the
result. Only the entries for which SELECTOR returns a non-zero
value are selected.
Finally the entries in *NAMELIST are sorted using the user-supplied
function CMP. The arguments passed to the CMP function are of type
struct dirent **, therefore one cannot directly use the strcmp
or strcoll functions; instead see the functions alphasort and
versionsort below.
The return value of the function is the number of entries placed in
*NAMELIST. If it is -1 an error occurred (either the directory
could not be opened for reading or the malloc call failed) and the
global variable errno contains more information on the error.
As described above, the fourth argument to the scandir function
must be a pointer to a sorting function. For the convenience of the
programmer the GNU C Library contains implementations of functions which
are very helpful for this purpose.
-- Function: int alphasort (const struct dirent **A, const struct
dirent **B)
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
*Note POSIX Safety Concepts::.
The alphasort function behaves like the strcoll function (*note
String/Array Comparison::). The difference is that the arguments
are not string pointers but instead they are of type struct dirent
**.
The return value of alphasort is less than, equal to, or greater
than zero depending on the order of the two entries A and B.
-- Function: int versionsort (const struct dirent **A, const struct
dirent **B)
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
The versionsort function is like alphasort except that it uses
the strverscmp function internally.
If the filesystem supports large files we cannot use the scandir
anymore since the dirent structure might not able to contain all the
information. The LFS provides the new type struct dirent64. To use
this we need a new function.
-- Function: int scandir64 (const char *DIR, struct dirent64
***NAMELIST, int (*SELECTOR) (const struct dirent64 *), int
(*CMP) (const struct dirent64 **, const struct dirent64 **))
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The scandir64 function works like the scandir function except
that the directory entries it returns are described by elements of
type struct dirent64. The function pointed to by SELECTOR is
again used to select the desired entries, except that SELECTOR now
must point to a function which takes a struct dirent64 *
parameter.
Similarly the CMP function should expect its two arguments to be of
type struct dirent64 **.
As CMP is now a function of a different type, the functions
alphasort and versionsort cannot be supplied for that argument.
Instead we provide the two replacement functions below.
-- Function: int alphasort64 (const struct dirent64 **A, const struct
dirent **B)
Preliminary: | MT-Safe locale | AS-Unsafe heap | AC-Unsafe mem |
*Note POSIX Safety Concepts::.
The alphasort64 function behaves like the strcoll function
(*note String/Array Comparison::). The difference is that the
arguments are not string pointers but instead they are of type
struct dirent64 **.
Return value of alphasort64 is less than, equal to, or greater
than zero depending on the order of the two entries A and B.
-- Function: int versionsort64 (const struct dirent64 **A, const struct
dirent64 **B)
Preliminary: | MT-Safe locale | AS-Safe | AC-Safe | *Note POSIX
Safety Concepts::.
The versionsort64 function is like alphasort64, excepted that
it uses the strverscmp function internally.
It is important not to mix the use of scandir and the 64-bit
comparison functions or vice versa. There are systems on which this
works but on others it will fail miserably.

File: libc.info, Node: Simple Directory Lister Mark II, Prev: Scanning Directory Content, Up: Accessing Directories
14.2.7 Simple Program to List a Directory, Mark II
--------------------------------------------------
Here is a revised version of the directory lister found above (*note
Simple Directory Lister::). Using the scandir function we can avoid
the functions which work directly with the directory contents. After
the call the returned entries are available for direct use.
#include <stdio.h>
#include <dirent.h>
static int
one (const struct dirent *unused)
{
return 1;
}
int
main (void)
{
struct dirent **eps;
int n;
n = scandir ("./", &eps, one, alphasort);
if (n >= 0)
{
int cnt;
for (cnt = 0; cnt < n; ++cnt)
puts (eps[cnt]->d_name);
}
else
perror ("Couldn't open the directory");
return 0;
}
Note the simple selector function in this example. Since we want to
see all directory entries we always return 1.

File: libc.info, Node: Working with Directory Trees, Next: Hard Links, Prev: Accessing Directories, Up: File System Interface
14.3 Working with Directory Trees
=================================
The functions described so far for handling the files in a directory
have allowed you to either retrieve the information bit by bit, or to
process all the files as a group (see scandir). Sometimes it is
useful to process whole hierarchies of directories and their contained
files. The X/Open specification defines two functions to do this. The
simpler form is derived from an early definition in System V systems and
therefore this function is available on SVID-derived systems. The
prototypes and required definitions can be found in the ftw.h header.
There are four functions in this family: ftw, nftw and their
64-bit counterparts ftw64 and nftw64. These functions take as one
of their arguments a pointer to a callback function of the appropriate
type.
-- Data Type: __ftw_func_t
int (*) (const char *, const struct stat *, int)
The type of callback functions given to the ftw function. The
first parameter points to the file name, the second parameter to an
object of type struct stat which is filled in for the file named
in the first parameter.
The last parameter is a flag giving more information about the
current file. It can have the following values:
FTW_F
The item is either a normal file or a file which does not fit
into one of the following categories. This could be special
files, sockets etc.
FTW_D
The item is a directory.
FTW_NS
The stat call failed and so the information pointed to by
the second parameter is invalid.
FTW_DNR
The item is a directory which cannot be read.
FTW_SL
The item is a symbolic link. Since symbolic links are
normally followed seeing this value in a ftw callback
function means the referenced file does not exist. The
situation for nftw is different.
This value is only available if the program is compiled with
_XOPEN_EXTENDED defined before including the first header.
The original SVID systems do not have symbolic links.
If the sources are compiled with _FILE_OFFSET_BITS == 64 this
type is in fact __ftw64_func_t since this mode changes struct
stat to be struct stat64.
For the LFS interface and for use in the function ftw64, the header
ftw.h defines another function type.
-- Data Type: __ftw64_func_t
int (*) (const char *, const struct stat64 *, int)
This type is used just like __ftw_func_t for the callback
function, but this time is called from ftw64. The second
parameter to the function is a pointer to a variable of type
struct stat64 which is able to represent the larger values.
-- Data Type: __nftw_func_t
int (*) (const char *, const struct stat *, int, struct FTW *)
The first three arguments are the same as for the __ftw_func_t
type. However for the third argument some additional values are
defined to allow finer differentiation:
FTW_DP
The current item is a directory and all subdirectories have
already been visited and reported. This flag is returned
instead of FTW_D if the FTW_DEPTH flag is passed to nftw
(see below).
FTW_SLN
The current item is a stale symbolic link. The file it points
to does not exist.
The last parameter of the callback function is a pointer to a
structure with some extra information as described below.
If the sources are compiled with _FILE_OFFSET_BITS == 64 this
type is in fact __nftw64_func_t since this mode changes struct
stat to be struct stat64.
For the LFS interface there is also a variant of this data type
available which has to be used with the nftw64 function.
-- Data Type: __nftw64_func_t
int (*) (const char *, const struct stat64 *, int, struct FTW *)
This type is used just like __nftw_func_t for the callback
function, but this time is called from nftw64. The second
parameter to the function is this time a pointer to a variable of
type struct stat64 which is able to represent the larger values.
-- Data Type: struct FTW
The information contained in this structure helps in interpreting
the name parameter and gives some information about the current
state of the traversal of the directory hierarchy.
int base
The value is the offset into the string passed in the first
parameter to the callback function of the beginning of the
file name. The rest of the string is the path of the file.
This information is especially important if the FTW_CHDIR
flag was set in calling nftw since then the current
directory is the one the current item is found in.
int level
Whilst processing, the code tracks how many directories down
it has gone to find the current file. This nesting level
starts at 0 for files in the initial directory (or is zero for
the initial file if a file was passed).
-- Function: int ftw (const char *FILENAME, __ftw_func_t FUNC, int
DESCRIPTORS)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The ftw function calls the callback function given in the
parameter FUNC for every item which is found in the directory
specified by FILENAME and all directories below. The function
follows symbolic links if necessary but does not process an item
twice. If FILENAME is not a directory then it itself is the only
object returned to the callback function.
The file name passed to the callback function is constructed by
taking the FILENAME parameter and appending the names of all passed
directories and then the local file name. So the callback function
can use this parameter to access the file. ftw also calls stat
for the file and passes that information on to the callback
function. If this stat call is not successful the failure is
indicated by setting the third argument of the callback function to
FTW_NS. Otherwise it is set according to the description given
in the account of __ftw_func_t above.
The callback function is expected to return 0 to indicate that no
error occurred and that processing should continue. If an error
occurred in the callback function or it wants ftw to return
immediately, the callback function can return a value other than 0.
This is the only correct way to stop the function. The program
must not use setjmp or similar techniques to continue from
another place. This would leave resources allocated by the ftw
function unfreed.
The DESCRIPTORS parameter to ftw specifies how many file
descriptors it is allowed to consume. The function runs faster the
more descriptors it can use. For each level in the directory
hierarchy at most one descriptor is used, but for very deep ones
any limit on open file descriptors for the process or the system
may be exceeded. Moreover, file descriptor limits in a
multi-threaded program apply to all the threads as a group, and
therefore it is a good idea to supply a reasonable limit to the
number of open descriptors.
The return value of the ftw function is 0 if all callback
function calls returned 0 and all actions performed by the ftw
succeeded. If a function call failed (other than calling stat on
an item) the function returns -1. If a callback function returns a
value other than 0 this value is returned as the return value of
ftw.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32-bit system this function is in fact ftw64, i.e., the LFS
interface transparently replaces the old interface.
-- Function: int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int
DESCRIPTORS)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
This function is similar to ftw but it can work on filesystems
with large files. File information is reported using a variable of
type struct stat64 which is passed by reference to the callback
function.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32-bit system this function is available under the name ftw and
transparently replaces the old implementation.
-- Function: int nftw (const char *FILENAME, __nftw_func_t FUNC, int
DESCRIPTORS, int FLAG)
Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
| *Note POSIX Safety Concepts::.
The nftw function works like the ftw functions. They call the
callback function FUNC for all items found in the directory
FILENAME and below. At most DESCRIPTORS file descriptors are
consumed during the nftw call.
One difference is that the callback function is of a different
type. It is of type struct FTW * and provides the callback
function with the extra information described above.
A second difference is that nftw takes a fourth argument, which
is 0 or a bitwise-OR combination of any of the following values.
FTW_PHYS
While traversing the directory symbolic links are not
followed. Instead symbolic links are reported using the
FTW_SL value for the type parameter to the callback
function. If the file referenced by a symbolic link does not
exist FTW_SLN is returned instead.
FTW_MOUNT
The callback function is only called for items which are on
the same mounted filesystem as the directory given by the
FILENAME parameter to nftw.
FTW_CHDIR
If this flag is given the current working directory is changed
to the directory of the reported object before the callback
function is called. When ntfw finally returns the current
directory is restored to its original value.
FTW_DEPTH
If this option is specified then all subdirectories and files
within them are processed before processing the top directory
itself (depth-first processing). This also means the type
flag given to the callback function is FTW_DP and not
FTW_D.
FTW_ACTIONRETVAL
If this option is specified then return values from callbacks
are handled differently. If the callback returns
FTW_CONTINUE, walking continues normally. FTW_STOP means
walking stops and FTW_STOP is returned to the caller. If
FTW_SKIP_SUBTREE is returned by the callback with FTW_D
argument, the subtree is skipped and walking continues with
next sibling of the directory. If FTW_SKIP_SIBLINGS is
returned by the callback, all siblings of the current entry
are skipped and walking continues in its parent. No other
return values should be returned from the callbacks if this
option is set. This option is a GNU extension.
The return value is computed in the same way as for ftw. nftw
returns 0 if no failures occurred and all callback functions
returned 0. In case of internal errors, such as memory problems,
the return value is -1 and ERRNO is set accordingly. If the return
value of a callback invocation was non-zero then that value is
returned.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32-bit system this function is in fact nftw64, i.e., the LFS
interface transparently replaces the old interface.
-- Function: int nftw64 (const char *FILENAME, __nftw64_func_t FUNC,
int DESCRIPTORS, int FLAG)
Preliminary: | MT-Safe cwd | AS-Unsafe heap | AC-Unsafe mem fd cwd
| *Note POSIX Safety Concepts::.
This function is similar to nftw but it can work on filesystems
with large files. File information is reported using a variable of
type struct stat64 which is passed by reference to the callback
function.
When the sources are compiled with _FILE_OFFSET_BITS == 64 on a
32-bit system this function is available under the name nftw and
transparently replaces the old implementation.

File: libc.info, Node: Hard Links, Next: Symbolic Links, Prev: Working with Directory Trees, Up: File System Interface
14.4 Hard Links
===============
In POSIX systems, one file can have many names at the same time. All of
the names are equally real, and no one of them is preferred to the
others.
To add a name to a file, use the link function. (The new name is
also called a “hard link” to the file.) Creating a new link to a file
does not copy the contents of the file; it simply makes a new name by
which the file can be known, in addition to the files existing name or
names.
One file can have names in several directories, so the organization
of the file system is not a strict hierarchy or tree.
In most implementations, it is not possible to have hard links to the
same file in multiple file systems. link reports an error if you try
to make a hard link to the file from another file system when this
cannot be done.
The prototype for the link function is declared in the header file
unistd.h.
-- Function: int link (const char *OLDNAME, const char *NEWNAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The link function makes a new link to the existing file named by
OLDNAME, under the new name NEWNAME.
This function returns a value of 0 if it is successful and -1
on failure. In addition to the usual file name errors (*note File
Name Errors::) for both OLDNAME and NEWNAME, the following errno
error conditions are defined for this function:
EACCES
You are not allowed to write to the directory in which the new
link is to be written.
EEXIST
There is already a file named NEWNAME. If you want to replace
this link with a new link, you must remove the old link
explicitly first.
EMLINK
There are already too many links to the file named by OLDNAME.
(The maximum number of links to a file is LINK_MAX; see
*note Limits for Files::.)
ENOENT
The file named by OLDNAME doesnt exist. You cant make a
link to a file that doesnt exist.
ENOSPC
The directory or file system that would contain the new link
is full and cannot be extended.
EPERM
On GNU/Linux and GNU/Hurd systems and some others, you cannot
make links to directories. Many systems allow only privileged
users to do so. This error is used to report the problem.
EROFS
The directory containing the new link cant be modified
because its on a read-only file system.
EXDEV
The directory specified in NEWNAME is on a different file
system than the existing file.
EIO
A hardware error occurred while trying to read or write the to
filesystem.
-- Function: int linkat (int oldfd, const char *OLDNAME, int newfd,
const char *NEWNAME, int flags)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The linkat function is analogous to the link function, except
that it identifies its source and target using a combination of a
file descriptor (referring to a directory) and a pathname. If a
pathnames is not absolute, it is resolved relative to the
corresponding file descriptor. The special file descriptor
AT_FDCWD denotes the current directory.
The FLAGS argument is a combination of the following flags:
AT_SYMLINK_FOLLOW
If the source path identified by OLDFD and OLDNAME is a
symbolic link, linkat follows the symbolic link and creates
a link to its target. If the flag is not set, a link for the
symbolic link itself is created; this is not supported by all
file systems and linkat can fail in this case.
AT_EMPTY_PATH
If this flag is specified, OLDNAME can be an empty string. In
this case, a new link to the file denoted by the descriptor
OLDFD is created, which may have been opened with O_PATH or
O_TMPFILE. This flag is a GNU extension.

File: libc.info, Node: Symbolic Links, Next: Deleting Files, Prev: Hard Links, Up: File System Interface
14.5 Symbolic Links
===================
GNU systems support “soft links” or “symbolic links”. This is a kind of
“file” that is essentially a pointer to another file name. Unlike hard
links, symbolic links can be made to directories or across file systems
with no restrictions. You can also make a symbolic link to a name which
is not the name of any file. (Opening this link will fail until a file
by that name is created.) Likewise, if the symbolic link points to an
existing file which is later deleted, the symbolic link continues to
point to the same file name even though the name no longer names any
file.
The reason symbolic links work the way they do is that special things
happen when you try to open the link. The open function realizes you
have specified the name of a link, reads the file name contained in the
link, and opens that file name instead. The stat function likewise
operates on the file that the symbolic link points to, instead of on the
link itself.
By contrast, other operations such as deleting or renaming the file
operate on the link itself. The functions readlink and lstat also
refrain from following symbolic links, because their purpose is to
obtain information about the link. link, the function that makes a
hard link, does too. It makes a hard link to the symbolic link, which
one rarely wants.
Some systems have, for some functions operating on files, a limit on
how many symbolic links are followed when resolving a path name. The
limit if it exists is published in the sys/param.h header file.
-- Macro: int MAXSYMLINKS
The macro MAXSYMLINKS specifies how many symlinks some function
will follow before returning ELOOP. Not all functions behave the
same and this value is not the same as that returned for
_SC_SYMLOOP by sysconf. In fact, the sysconf result can
indicate that there is no fixed limit although MAXSYMLINKS exists
and has a finite value.
Prototypes for most of the functions listed in this section are in
unistd.h.
-- Function: int symlink (const char *OLDNAME, const char *NEWNAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The symlink function makes a symbolic link to OLDNAME named
NEWNAME.
The normal return value from symlink is 0. A return value of
-1 indicates an error. In addition to the usual file name syntax
errors (*note File Name Errors::), the following errno error
conditions are defined for this function:
EEXIST
There is already an existing file named NEWNAME.
EROFS
The file NEWNAME would exist on a read-only file system.
ENOSPC
The directory or file system cannot be extended to make the
new link.
EIO
A hardware error occurred while reading or writing data on the
disk.
-- Function: ssize_t readlink (const char *FILENAME, char *BUFFER,
size_t SIZE)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The readlink function gets the value of the symbolic link
FILENAME. The file name that the link points to is copied into
BUFFER. This file name string is _not_ null-terminated; readlink
normally returns the number of characters copied. The SIZE
argument specifies the maximum number of characters to copy,
usually the allocation size of BUFFER.
If the return value equals SIZE, you cannot tell whether or not
there was room to return the entire name. So make a bigger buffer
and call readlink again. Here is an example:
char *
readlink_malloc (const char *filename)
{
int size = 100;
char *buffer = NULL;
while (1)
{
buffer = (char *) xrealloc (buffer, size);
int nchars = readlink (filename, buffer, size);
if (nchars < 0)
{
free (buffer);
return NULL;
}
if (nchars < size)
return buffer;
size *= 2;
}
}
A value of -1 is returned in case of error. In addition to the
usual file name errors (*note File Name Errors::), the following
errno error conditions are defined for this function:
EINVAL
The named file is not a symbolic link.
EIO
A hardware error occurred while reading or writing data on the
disk.
In some situations it is desirable to resolve all the symbolic links
to get the real name of a file where no prefix names a symbolic link
which is followed and no filename in the path is . or ... This is
for instance desirable if files have to be compared in which case
different names can refer to the same inode.
-- Function: char * canonicalize_file_name (const char *NAME)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
The canonicalize_file_name function returns the absolute name of
the file named by NAME which contains no ., .. components nor
any repeated path separators (/) or symlinks. The result is
passed back as the return value of the function in a block of
memory allocated with malloc. If the result is not used anymore
the memory should be freed with a call to free.
If any of the path components are missing the function returns a
NULL pointer. This is also what is returned if the length of the
path reaches or exceeds PATH_MAX characters. In any case errno
is set accordingly.
ENAMETOOLONG
The resulting path is too long. This error only occurs on
systems which have a limit on the file name length.
EACCES
At least one of the path components is not readable.
ENOENT
The input file name is empty.
ENOENT
At least one of the path components does not exist.
ELOOP
More than MAXSYMLINKS many symlinks have been followed.
This function is a GNU extension and is declared in stdlib.h.
The Unix standard includes a similar function which differs from
canonicalize_file_name in that the user has to provide the buffer
where the result is placed in.
-- Function: char * realpath (const char *restrict NAME, char *restrict
RESOLVED)
Preliminary: | MT-Safe | AS-Unsafe heap | AC-Unsafe mem fd | *Note
POSIX Safety Concepts::.
A call to realpath where the RESOLVED parameter is NULL behaves
exactly like canonicalize_file_name. The function allocates a
buffer for the file name and returns a pointer to it. If RESOLVED
is not NULL it points to a buffer into which the result is
copied. It is the callers responsibility to allocate a buffer
which is large enough. On systems which define PATH_MAX this
means the buffer must be large enough for a pathname of this size.
For systems without limitations on the pathname length the
requirement cannot be met and programs should not call realpath
with anything but NULL for the second parameter.
One other difference is that the buffer RESOLVED (if nonzero) will
contain the part of the path component which does not exist or is
not readable if the function returns NULL and errno is set to
EACCES or ENOENT.
This function is declared in stdlib.h.
The advantage of using this function is that it is more widely
available. The drawback is that it reports failures for long paths on
systems which have no limits on the file name length.

File: libc.info, Node: Deleting Files, Next: Renaming Files, Prev: Symbolic Links, Up: File System Interface
14.6 Deleting Files
===================
You can delete a file with unlink or remove.
Deletion actually deletes a file name. If this is the files only
name, then the file is deleted as well. If the file has other remaining
names (*note Hard Links::), it remains accessible under those names.
-- Function: int unlink (const char *FILENAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The unlink function deletes the file name FILENAME. If this is a
files sole name, the file itself is also deleted. (Actually, if
any process has the file open when this happens, deletion is
postponed until all processes have closed the file.)
The function unlink is declared in the header file unistd.h.
This function returns 0 on successful completion, and -1 on
error. In addition to the usual file name errors (*note File Name
Errors::), the following errno error conditions are defined for
this function:
EACCES
Write permission is denied for the directory from which the
file is to be removed, or the directory has the sticky bit set
and you do not own the file.
EBUSY
This error indicates that the file is being used by the system
in such a way that it cant be unlinked. For example, you
might see this error if the file name specifies the root
directory or a mount point for a file system.
ENOENT
The file name to be deleted doesnt exist.
EPERM
On some systems unlink cannot be used to delete the name of
a directory, or at least can only be used this way by a
privileged user. To avoid such problems, use rmdir to
delete directories. (On GNU/Linux and GNU/Hurd systems
unlink can never delete the name of a directory.)
EROFS
The directory containing the file name to be deleted is on a
read-only file system and cant be modified.
-- Function: int rmdir (const char *FILENAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The rmdir function deletes a directory. The directory must be
empty before it can be removed; in other words, it can only contain
entries for . and ...
In most other respects, rmdir behaves like unlink. There are
two additional errno error conditions defined for rmdir:
ENOTEMPTY
EEXIST
The directory to be deleted is not empty.
These two error codes are synonymous; some systems use one, and
some use the other. GNU/Linux and GNU/Hurd systems always use
ENOTEMPTY.
The prototype for this function is declared in the header file
unistd.h.
-- Function: int remove (const char *FILENAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This is the ISO C function to remove a file. It works like
unlink for files and like rmdir for directories. remove is
declared in stdio.h.

File: libc.info, Node: Renaming Files, Next: Creating Directories, Prev: Deleting Files, Up: File System Interface
14.7 Renaming Files
===================
The rename function is used to change a files name.
-- Function: int rename (const char *OLDNAME, const char *NEWNAME)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The rename function renames the file OLDNAME to NEWNAME. The
file formerly accessible under the name OLDNAME is afterwards
accessible as NEWNAME instead. (If the file had any other names
aside from OLDNAME, it continues to have those names.)
The directory containing the name NEWNAME must be on the same file
system as the directory containing the name OLDNAME.
One special case for rename is when OLDNAME and NEWNAME are two
names for the same file. The consistent way to handle this case is
to delete OLDNAME. However, in this case POSIX requires that
rename do nothing and report success—which is inconsistent. We
dont know what your operating system will do.
If OLDNAME is not a directory, then any existing file named NEWNAME
is removed during the renaming operation. However, if NEWNAME is
the name of a directory, rename fails in this case.
If OLDNAME is a directory, then either NEWNAME must not exist or it
must name a directory that is empty. In the latter case, the
existing directory named NEWNAME is deleted first. The name
NEWNAME must not specify a subdirectory of the directory oldname
which is being renamed.
One useful feature of rename is that the meaning of NEWNAME
changes “atomically” from any previously existing file by that name
to its new meaning (i.e., the file that was called OLDNAME). There
is no instant at which NEWNAME is non-existent “in between” the old
meaning and the new meaning. If there is a system crash during the
operation, it is possible for both names to still exist; but
NEWNAME will always be intact if it exists at all.
If rename fails, it returns -1. In addition to the usual file
name errors (*note File Name Errors::), the following errno error
conditions are defined for this function:
EACCES
One of the directories containing NEWNAME or OLDNAME refuses
write permission; or NEWNAME and OLDNAME are directories and
write permission is refused for one of them.
EBUSY
A directory named by OLDNAME or NEWNAME is being used by the
system in a way that prevents the renaming from working. This
includes directories that are mount points for filesystems,
and directories that are the current working directories of
processes.
ENOTEMPTY
EEXIST
The directory NEWNAME isnt empty. GNU/Linux and GNU/Hurd
systems always return ENOTEMPTY for this, but some other
systems return EEXIST.
EINVAL
OLDNAME is a directory that contains NEWNAME.
EISDIR
NEWNAME is a directory but the OLDNAME isnt.
EMLINK
The parent directory of NEWNAME would have too many links
(entries).
ENOENT
The file OLDNAME doesnt exist.
ENOSPC
The directory that would contain NEWNAME has no room for
another entry, and there is no space left in the file system
to expand it.
EROFS
The operation would involve writing to a directory on a
read-only file system.
EXDEV
The two file names NEWNAME and OLDNAME are on different file
systems.

File: libc.info, Node: Creating Directories, Next: File Attributes, Prev: Renaming Files, Up: File System Interface
14.8 Creating Directories
=========================
Directories are created with the mkdir function. (There is also a
shell command mkdir which does the same thing.)
-- Function: int mkdir (const char *FILENAME, mode_t MODE)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The mkdir function creates a new, empty directory with name
FILENAME.
The argument MODE specifies the file permissions for the new
directory file. *Note Permission Bits::, for more information
about this.
A return value of 0 indicates successful completion, and -1
indicates failure. In addition to the usual file name syntax
errors (*note File Name Errors::), the following errno error
conditions are defined for this function:
EACCES
Write permission is denied for the parent directory in which
the new directory is to be added.
EEXIST
A file named FILENAME already exists.
EMLINK
The parent directory has too many links (entries).
Well-designed file systems never report this error, because
they permit more links than your disk could possibly hold.
However, you must still take account of the possibility of
this error, as it could result from network access to a file
system on another machine.
ENOSPC
The file system doesnt have enough room to create the new
directory.
EROFS
The parent directory of the directory being created is on a
read-only file system and cannot be modified.
To use this function, your program should include the header file
sys/stat.h.

File: libc.info, Node: File Attributes, Next: Making Special Files, Prev: Creating Directories, Up: File System Interface
14.9 File Attributes
====================
When you issue an ls -l shell command on a file, it gives you
information about the size of the file, who owns it, when it was last
modified, etc. These are called the “file attributes”, and are
associated with the file itself and not a particular one of its names.
This section contains information about how you can inquire about and
modify the attributes of a file.
* Menu:
* Attribute Meanings:: The names of the file attributes,
and what their values mean.
* Reading Attributes:: How to read the attributes of a file.
* Testing File Type:: Distinguishing ordinary files,
directories, links...
* File Owner:: How ownership for new files is determined,
and how to change it.
* Permission Bits:: How information about a files access
mode is stored.
* Access Permission:: How the system decides who can access a file.
* Setting Permissions:: How permissions for new files are assigned,
and how to change them.
* Testing File Access:: How to find out if your process can
access a file.
* File Times:: About the time attributes of a file.
* File Size:: Manually changing the size of a file.
* Storage Allocation:: Allocate backing storage for files.

File: libc.info, Node: Attribute Meanings, Next: Reading Attributes, Up: File Attributes
14.9.1 The meaning of the File Attributes
-----------------------------------------
When you read the attributes of a file, they come back in a structure
called struct stat. This section describes the names of the
attributes, their data types, and what they mean. For the functions to
read the attributes of a file, see *note Reading Attributes::.
The header file sys/stat.h declares all the symbols defined in this
section.
-- Data Type: struct stat
The stat structure type is used to return information about the
attributes of a file. It contains at least the following members:
mode_t st_mode
Specifies the mode of the file. This includes file type
information (*note Testing File Type::) and the file
permission bits (*note Permission Bits::).
ino_t st_ino
The file serial number, which distinguishes this file from all
other files on the same device.
dev_t st_dev
Identifies the device containing the file. The st_ino and
st_dev, taken together, uniquely identify the file. The
st_dev value is not necessarily consistent across reboots or
system crashes, however.
nlink_t st_nlink
The number of hard links to the file. This count keeps track
of how many directories have entries for this file. If the
count is ever decremented to zero, then the file itself is
discarded as soon as no process still holds it open. Symbolic
links are not counted in the total.
uid_t st_uid
The user ID of the files owner. *Note File Owner::.
gid_t st_gid
The group ID of the file. *Note File Owner::.
off_t st_size
This specifies the size of a regular file in bytes. For files
that are really devices this field isnt usually meaningful.
For symbolic links this specifies the length of the file name
the link refers to.
time_t st_atime
This is the last access time for the file. *Note File
Times::.
unsigned long int st_atime_usec
This is the fractional part of the last access time for the
file. *Note File Times::.
time_t st_mtime
This is the time of the last modification to the contents of
the file. *Note File Times::.
unsigned long int st_mtime_usec
This is the fractional part of the time of the last
modification to the contents of the file. *Note File Times::.
time_t st_ctime
This is the time of the last modification to the attributes of
the file. *Note File Times::.
unsigned long int st_ctime_usec
This is the fractional part of the time of the last
modification to the attributes of the file. *Note File
Times::.
blkcnt_t st_blocks
This is the amount of disk space that the file occupies,
measured in units of 512-byte blocks.
The number of disk blocks is not strictly proportional to the
size of the file, for two reasons: the file system may use
some blocks for internal record keeping; and the file may be
sparse—it may have “holes” which contain zeros but do not
actually take up space on the disk.
You can tell (approximately) whether a file is sparse by
comparing this value with st_size, like this:
(st.st_blocks * 512 < st.st_size)
This test is not perfect because a file that is just slightly
sparse might not be detected as sparse at all. For practical
applications, this is not a problem.
unsigned int st_blksize
The optimal block size for reading or writing this file, in
bytes. You might use this size for allocating the buffer
space for reading or writing the file. (This is unrelated to
st_blocks.)
The extensions for the Large File Support (LFS) require, even on
32-bit machines, types which can handle file sizes up to 2^63.
Therefore a new definition of struct stat is necessary.
-- Data Type: struct stat64
The members of this type are the same and have the same names as
those in struct stat. The only difference is that the members
st_ino, st_size, and st_blocks have a different type to
support larger values.
mode_t st_mode
Specifies the mode of the file. This includes file type
information (*note Testing File Type::) and the file
permission bits (*note Permission Bits::).
ino64_t st_ino
The file serial number, which distinguishes this file from all
other files on the same device.
dev_t st_dev
Identifies the device containing the file. The st_ino and
st_dev, taken together, uniquely identify the file. The
st_dev value is not necessarily consistent across reboots or
system crashes, however.
nlink_t st_nlink
The number of hard links to the file. This count keeps track
of how many directories have entries for this file. If the
count is ever decremented to zero, then the file itself is
discarded as soon as no process still holds it open. Symbolic
links are not counted in the total.
uid_t st_uid
The user ID of the files owner. *Note File Owner::.
gid_t st_gid
The group ID of the file. *Note File Owner::.
off64_t st_size
This specifies the size of a regular file in bytes. For files
that are really devices this field isnt usually meaningful.
For symbolic links this specifies the length of the file name
the link refers to.
time_t st_atime
This is the last access time for the file. *Note File
Times::.
unsigned long int st_atime_usec
This is the fractional part of the last access time for the
file. *Note File Times::.
time_t st_mtime
This is the time of the last modification to the contents of
the file. *Note File Times::.
unsigned long int st_mtime_usec
This is the fractional part of the time of the last
modification to the contents of the file. *Note File Times::.
time_t st_ctime
This is the time of the last modification to the attributes of
the file. *Note File Times::.
unsigned long int st_ctime_usec
This is the fractional part of the time of the last
modification to the attributes of the file. *Note File
Times::.
blkcnt64_t st_blocks
This is the amount of disk space that the file occupies,
measured in units of 512-byte blocks.
unsigned int st_blksize
The optimal block size for reading of writing this file, in
bytes. You might use this size for allocating the buffer
space for reading of writing the file. (This is unrelated to
st_blocks.)
Some of the file attributes have special data type names which exist
specifically for those attributes. (They are all aliases for well-known
integer types that you know and love.) These typedef names are defined
in the header file sys/types.h as well as in sys/stat.h. Here is a
list of them.
-- Data Type: mode_t
This is an integer data type used to represent file modes. In the
GNU C Library, this is an unsigned type no narrower than unsigned
int.
-- Data Type: ino_t
This is an unsigned integer type used to represent file serial
numbers. (In Unix jargon, these are sometimes called “inode
numbers”.) In the GNU C Library, this type is no narrower than
unsigned int.
If the source is compiled with _FILE_OFFSET_BITS == 64 this type
is transparently replaced by ino64_t.
-- Data Type: ino64_t
This is an unsigned integer type used to represent file serial
numbers for the use in LFS. In the GNU C Library, this type is no
narrower than unsigned int.
When compiling with _FILE_OFFSET_BITS == 64 this type is
available under the name ino_t.
-- Data Type: dev_t
This is an arithmetic data type used to represent file device
numbers. In the GNU C Library, this is an integer type no narrower
than int.
-- Data Type: nlink_t
This is an integer type used to represent file link counts.
-- Data Type: blkcnt_t
This is a signed integer type used to represent block counts. In
the GNU C Library, this type is no narrower than int.
If the source is compiled with _FILE_OFFSET_BITS == 64 this type
is transparently replaced by blkcnt64_t.
-- Data Type: blkcnt64_t
This is a signed integer type used to represent block counts for
the use in LFS. In the GNU C Library, this type is no narrower than
int.
When compiling with _FILE_OFFSET_BITS == 64 this type is
available under the name blkcnt_t.

File: libc.info, Node: Reading Attributes, Next: Testing File Type, Prev: Attribute Meanings, Up: File Attributes
14.9.2 Reading the Attributes of a File
---------------------------------------
To examine the attributes of files, use the functions stat, fstat
and lstat. They return the attribute information in a struct stat
object. All three functions are declared in the header file
sys/stat.h.
-- Function: int stat (const char *FILENAME, struct stat *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The stat function returns information about the attributes of the
file named by FILENAME in the structure pointed to by BUF.
If FILENAME is the name of a symbolic link, the attributes you get
describe the file that the link points to. If the link points to a
nonexistent file name, then stat fails reporting a nonexistent
file.
The return value is 0 if the operation is successful, or -1 on
failure. In addition to the usual file name errors (*note File
Name Errors::, the following errno error conditions are defined
for this function:
ENOENT
The file named by FILENAME doesnt exist.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact stat64 since the LFS interface transparently
replaces the normal implementation.
-- Function: int stat64 (const char *FILENAME, struct stat64 *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is similar to stat but it is also able to work on
files larger than 2^31 bytes on 32-bit systems. To be able to do
this the result is stored in a variable of type struct stat64 to
which BUF must point.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name stat and so transparently
replaces the interface for small files on 32-bit machines.
-- Function: int fstat (int FILEDES, struct stat *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The fstat function is like stat, except that it takes an open
file descriptor as an argument instead of a file name. *Note
Low-Level I/O::.
Like stat, fstat returns 0 on success and -1 on failure.
The following errno error conditions are defined for fstat:
EBADF
The FILEDES argument is not a valid file descriptor.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact fstat64 since the LFS interface transparently
replaces the normal implementation.
-- Function: int fstat64 (int FILEDES, struct stat64 *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is similar to fstat but is able to work on large
files on 32-bit platforms. For large files the file descriptor
FILEDES should be obtained by open64 or creat64. The BUF
pointer points to a variable of type struct stat64 which is able
to represent the larger values.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name fstat and so transparently
replaces the interface for small files on 32-bit machines.
-- Function: int lstat (const char *FILENAME, struct stat *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
The lstat function is like stat, except that it does not follow
symbolic links. If FILENAME is the name of a symbolic link,
lstat returns information about the link itself; otherwise
lstat works like stat. *Note Symbolic Links::.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is in fact lstat64 since the LFS interface transparently
replaces the normal implementation.
-- Function: int lstat64 (const char *FILENAME, struct stat64 *BUF)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | *Note POSIX Safety
Concepts::.
This function is similar to lstat but it is also able to work on
files larger than 2^31 bytes on 32-bit systems. To be able to do
this the result is stored in a variable of type struct stat64 to
which BUF must point.
When the sources are compiled with _FILE_OFFSET_BITS == 64 this
function is available under the name lstat and so transparently
replaces the interface for small files on 32-bit machines.