Что делает флаг FD_CLOEXEC fcntl()?
Вот так:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
Хотя я читал man fcntl
Я не могу понять, что он делает.
3 ответа
Он устанавливает флаг close-on-exec для файлового дескриптора, который заставляет файловый дескриптор автоматически (и атомарно) закрываться, когда любой из exec
Семейные функции успешны.
Он также проверяет возвращаемое значение, чтобы определить, не завершилась ли операция, что довольно бесполезно, если дескриптор файла действителен, поскольку нет условия, при котором эта операция должна завершиться с ошибкой на допустимом дескрипторе файла.
Он помечает дескриптор файла так, что он будет close()
г автоматически, когда процесс или какие-либо дети это fork()
S называет один из exec*()
семейство функций. Это полезно для предотвращения утечки дескрипторов файлов в случайные программы, выполняемые, например, system()
,
Обратите внимание, что использование этого флага необходимо в некоторых многопоточных программах, поскольку использование отдельногоfcntl(2) F_SETFD
операцию по установкеFD_CLOEXEC
флага недостаточно, чтобы избежать условий гонки, когда один поток открывает дескриптор файла и пытается установить свой флаг закрытия при выполнении, используяfcntl(2)
в то же время, как другой поток делает плюсexecve(2)
. В зависимости от порядка выполнения гонка может привести к файловому дескриптору, возвращаемомуopen()
непреднамеренная утечка в программу, выполняемую дочерним процессом, созданнымfork(2)
.
(Такая гонка, в принципе, возможна для любого системного вызова, создающего файловый дескриптор, для которого должен быть установлен флаг close-on-exec, а различные другие системные вызовы Linux обеспечивают эквивалентO_CLOEXEC
флаг для решения этой проблемы.)