Copyright (C) 2000-2012 |
GNU Info (libc.info)Getting File Status FlagsGetting 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 can't 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. Don't 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); } automatically generated by info2www version 1.2.2.9 |