2016-12-08 14 views
4

В (немецкой) книге о программировании на языке 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 флаг будет установлен?

+0

Возможно, они говорят о библиотечной функции, которая не знает, какие дескрипторы вызывающий установил флаг * close-on-exec *, поэтому он должен принять худшее. – Barmar

+2

Кроме того, библиотека не должна изменять состояние дескрипторов файлов, которые использует вызывающий. – Barmar

+0

@Barmar, если это не его цель, ncurses, libcaca и т. Д. – Stargateur

ответ

1

Совет неправильный. Close-on-exec устанавливается только в дескрипторах файлов, которые ваша программа явно запрашивает close-on-exec.

Причины вы можете выбрать для использования dup2 могут быть:

  • Процесс будет выполняться ожидает, что ее ввод/вывод, чтобы быть с помощью конкретных файловых дескрипторов (обычно 0, 1 и 2, что соответствует стандартному вводу , выходные и потоки ошибок соответственно) или
  • процесс закрывает некоторые файловые дескрипторы по любой причине, и вам нужно, чтобы этот fd находился за пределами диапазона, который должен быть закрыт.

Описание также немного вводит в заблуждение - это только новый дескриптор (т.е. значение, возвращаемое dup() или dup2()), который имеет близко-на-Exec неустановленной. Состояние исходного кода fd не изменяется.