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


         

Описание


uses linux;

Procedure Pause;

Вызов pause приостанавливает выполнение вызывающего процесса (так что процесс при этом не занимает процессорного времени) до получения любого сигнала, например, сигнала SIGALRM. Если сигнал вызывает нормальное завершена процесса или игнорируется процессом, то в результате вызова pause будет просто выполнено соответствующее действие (завершение работы или игнорирована сигнала).

Следующая программа tml (сокращение от «tell me later» – напомнить позднее) использует оба вызова alarm и pause для вывода сообщения в течение заданного числа минут. Она вызывается следующим образом:

$ tml число_минут текст_сообщения

Например:

$ tml 10 время идти домой

Перед сообщением выводятся три символа

Ctrl+G (звуковые сигналы) для привлечения внимания пользователя. Обратите внимание на создание в программе tml фонового процесса при помощи вызова fork. Фоновый процесс выполняет работу, позволяя пользователю продолжать выполнение других задач.

 (* tml - программа для напоминания *)

{$mode objfpc}

uses linux, stdio, sysutils;

const

  BELLS=#7#7#7;   (* звуковой сигнал ASCII *)

  alarm_flag:boolean = FALSE;

(* Обработчик сигнала SIGALRM *)

procedure setflag(sig:integer);cdecl;

begin

  alarm_flag := TRUE;

end;

var

  nsecs, j:integer;

  pid:longint;

  act:sigactionrec;

begin

  if paramcount < 2 then

  begin

    writeln (stderr, 'Применение: tml число_минут сообщение');

    halt(1);

  end;

  try

    nsecs := strtoint(paramstr(1)) * 60;

  except

    on e:econverterror do

    begin

      writeln (stderr, 'Введено нечисловое значение');

      halt(2);

    end; 

  end;

  if nsecs <= 0 then

  begin

    writeln (stderr, 'tml: недопустимое время');

    halt(3);

  end;

  (* Вызов fork, создающий фоновый процесс *)

  pid := fork;

  case pid of

    -1:               (* ошибка *)

    begin

      perror ('tml');

      halt(1);

    end;

    0:                (* дочерний процесс *)




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