В (немецкой) книге о программировании на языке C (Linux-UNIX-Programmierung, Jürgen Wolf) Я нашел заявление, переведенное на английский язык, следующим образом (предложения, пронумерованные me):C: dup и close-on-exec
В некоторых случаях может потребоваться дублировать дескриптор файла [1]. Примером этого может быть, если родительский процесс хочет обмениваться данными с дочерним процессом, а дочерний процесс накладывается новым процессом с использованием
exec*()
[2]. В таком случае безdup() or dup2()
флаг будет установлен в положение [3]. Когда этот флаг установлен, все дескрипторы файлов становятся недействительными (поскольку они накладываются новым процессом), то есть они больше не присутствуют [4]. Таким образом, связь между родительским и дочерним процессами будет остановлена [5]. Если, с другой стороны, вы дублируете файловый дескриптор сdup() or dup2()
, то флаг close-on-exec удаляется, а недавно наложенный процесс может использовать этот файловый дескриптор для связи [6].
Я считаю, что приведенный выше параграф содержит несколько вводящих в заблуждение утверждений или даже ошибок.
В предложении [3], я не понимаю, почему без использования dup()
или dup2()
крупным на Exec флаг будет установлен?
Возможно, они говорят о библиотечной функции, которая не знает, какие дескрипторы вызывающий установил флаг * close-on-exec *, поэтому он должен принять худшее. – Barmar
Кроме того, библиотека не должна изменять состояние дескрипторов файлов, которые использует вызывающий. – Barmar
@Barmar, если это не его цель, ncurses, libcaca и т. Д. – Stargateur