Файловые дескрипторы предназначены для всего процесса.При использовании в функции или потоке они всегда работают одинаково.Этот способ контролируется флагами состояния .В Linux есть пять флагов состояния :
O_APPEND
: вызывает все записи в конце файла, игнорируя положение файла.
O_ASYNC
: сигнал генерируется, когда возможно чтение или запись;доступно только для терминалов, псевдотерминалов, розеток, труб и FIFO.(Кажется, я помню, что оно доступно и для некоторых символьных устройств, но я не проверил, какие из них, если таковые имеются, на страницах руководства не сказано.)
O_DIRECT
:Пропустить кэш страницы для ввода / вывода.Сложный, со многими ограничениями;не использовать, за исключением особых случаев.
O_NOATIME
: не обновлять время последнего доступа.
O_NONBLOCK
: неблокировка ввода / вывода.Вместо ожидания (блокировки), когда данные не доступны немедленно или не могут быть немедленно отправлены, верните короткий счет.Если ничего нельзя отправить или получить, read()
/ write()
и т. Д. Верните -1 с помощью errno == EWOULDBLOCK
.
O_NONBLOCK
не влияет на обычные файлы или блочные устройства.
Вы можете изменить их, установив новый набор флагов состояния, используя fcntl(fd, F_SETFL, flags)
,с ноль или более флагов ИЛИ вместе.(Чтобы отключить все, используйте ноль.)
fcntl(fd, F_SETFD, dflags)
устанавливает набор флагов файловых дескрипторов .В настоящее время существует только один такой флаг, O_CLOEXEC
, который заставляет дескриптор автоматически закрываться при успешном выполнении execve()
или другого семейства функций exec (включая popen()
и все остальные, которые разветвляются и выполняют новый процесс).O_CLOEXEC
обычно используется как флаг для вызова open()
, однако, чтобы избежать окна гонки с другим потоком, делающим fork()
между ними.
Когда вы используете open(filename, flags)
или open(filename, flags, mode)
аргумент flags
представляет собой комбинацию режима доступа (O_RDONLY
, O_WRONLY
или O_RDWR
; должен использоваться только один), флагов создания файлов (включая флаги дескриптора файла) и флагов состояния файла, ИЛИ 'Вместе(За исключением O_ASYNC
, который не может быть указан во время open()
и должен быть установлен позже с помощью fcntl(fd, F_SETFL, flags | O_ASYNC)
.)