Системное программирование в UNIX средствами Free Pascal




Описание


uses stdio;

function wait(status:pinteger):longint;

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

Вызов wait часто осуществляется родительским процессом после вызова fork, например:

.

.

.

var

  status:integer;

  cpid:longint;

cpid := fork; (*Создать новый процесс *)

if cpid = 0 then

begin

  (* Дочерний процесс *)

  (* Выполнить какие-либо действия ... *)

end

else

begin

  /* Родительский процесс, ожидание завершения дочернего */

  cpid := wait(@status);

  writeln('Дочерний процесс ', cpid, ' завершился');

end;

.

.

.

Сочетание вызовов fork и wait наиболее полезно, если дочерний процесс предназначен для выполнения совершенно другой программы при помощи вызова ехеc.

Возвращаемое значение wait обычно является идентификатором дочернего процесса, который завершил свою работу. Если вызов

wait возвращает значение -1, это может означать, что дочерние процессы не существуют, и в этом случае переменная linuxerror будет содержать код ошибки Sys_ECHILD. Возможность определить завершение каждого из дочерних процессов по отдельности означает, что родительский процесс может выполнять цикл, ожидая завершения каждого из потомков, а после того, как все они завершатся, продолжать свою работу.

Вызов wait принимает один аргумент, status, – указатель на целое число. Если указатель равен nil, то аргумент просто игнорируется. Если же вызову wait передается допустимый указатель, то после возврата из вызова wait переменная status будет содержать полезную информацию о статусе завершения процесса. Обычно эта информация будет представлять собой код завершения дочернего процесса, переданный при помощи вызова halt.

Следующая программа status показывает, как может быть использован вызов wait:




Содержание  Назад  Вперед