Что делает флаг 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флаг для решения этой проблемы.)

Другие вопросы по тегам