Флаги и функции дескриптора файла - PullRequest
0 голосов
/ 22 мая 2018

Я хотел бы знать, что происходит с флагом O_NONBLOCK, когда я использую данный file_des в функции.Сохраняет ли он установленный флаг или нет?

Если нет, должен ли я сбросить его внутри function?Есть ли другой способ?

main()
{
    int file_des;

    fcntl(file_des, F_SETFD, O_NONBLOCK);
    function(file_des);

}

function(int file_des)
{
    //do something with file_des
    //What happens with the O_NONBLOCK flag?
}

1 Ответ

0 голосов
/ 23 мая 2018

Файловые дескрипторы предназначены для всего процесса.При использовании в функции или потоке они всегда работают одинаково.Этот способ контролируется флагами состояния .В 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).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...