Скачиваний:
56
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

5.5.2. Вызов ехес и открытые файлы

Дескрипторы открытых файлов обычно сохраняют свое состояние также во время вызова ехес, то есть файлы, открытые в исходной программе, остаются открытыми, когда совершенно новая программа запускается при помощи вызова ехес. Указатели чтения-записи на такие файлы остаются неизменными после вызова ехес. (Очевидно, не имеет смысла говорить о сохранении значений переменных после вызова ехес, так как в общем случае новая программа совершенно отличается от старой.)

Тем не менее есть связанный с файловым дескриптором флаг 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 – в противном случае.

5.6. Завершение процессов при помощи системного вызова halt Описание

uses system;

procedure halt(status:word);

Системный вызов halt уже известен, но теперь следует дать его правильное описание. Этот вызов используется для завершения процесса, хотя это также происходит, когда управление доходит до конца тела главной программы или до процедуры exit в теле главной программы.

Единственный целочисленный аргумент вызова halt называется статусом завершения (exit status) процесса, младшие восемь бит которого доступны родительскому процессу при условии, если он выполнил системный вызов wait (подробнее об этом см. в следующем разделе). При этом возвращаемое вызовом halt значение обычно используется для определения успешного или неудачного завершения выполнявшейся процессом задачи. По принятому соглашению, нулевое возвращаемое значение соответствует нормальному завершению, а ненулевое значение говорит о том, что что-то случилось.

Кроме завершения вызывающего его процесса, вызов halt имеет еще несколько последствий: наиболее важным из них является закрытие всех открытых дескрипторов файлов. Если, как это было в последнем примере, родительский процесс выполнял вызов wait, то его выполнение продолжится.

Для полноты изложения следует также упомянуть системный вызов _exit, который отличается от вызова halt наличием символа подчеркивания в начале. Он используется в точности так же, как и вызов halt. Тем не менее он не включает описанные ранее действия по очистке. В большинстве случаев следует избегать использования вызова _exit.

Упражнение 5.7. Статус завершения программы можно получить в командном интерпретаторе при помощи переменной $?, например:

$ ls nonesuch

nonesuch: No such file or directory

$ echo $?

2

Напишите программу fake, которая использует целочисленное значение первого аргумента в качестве статуса завершения. Используя намеченный выше метод, выполните программу fake, задавая различные значения аргументов, включая большие и отрицательные. Есть ли польза от программы fake?

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal