Вызов ехес и открытые файлы
Дескрипторы открытых файлов обычно сохраняют свое состояние также во время вызова ехес, то есть файлы, открытые в исходной программе, остаются открытыми, когда совершенно новая программа запускается при помощи вызова ехес. Указатели чтения-записи на такие файлы остаются неизменными после вызова ехес. (Очевидно, не имеет смысла говорить о сохранении значений переменных после вызова ехес, так как в общем случае новая программа совершенно отличается от старой.)
Тем не менее есть связанный с файловым дескриптором флаг close-on-exec
(закрывать при вызове ехес), который может быть установлен с помощью универсальной процедуры fcntl. Если этот флаг установлен (по умолчанию он сброшен), то файл закрывается при вызове любой функции семейства ехес. Следующий фрагмент показывает, как устанавливается флаг close-on-exec:
uses linux;
.
.
.
var
fd:longint;
fd := fdopen('file', Open_RDONLY);
.
.
.
(* Установить флаг close-on-exec *)
fcntl(fd, F_SETFD, 1);
Флаг close-on-exec можно сбросить так:
fcntl(fd, F_SETFD, 0);
Значение флага можно получить следующим образом:
res := fcntl(fd, F_GETFD);
Целое res будет иметь значение 1, если флаг close-on-exit установлен для дескриптора файла fd, и 0 – в противном случае.