(* 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:			(* дочерний процесс *)
      ;
    else		(* родительский процесс *)
    begin
      writeln('Процесс tml с идентификатором ', pid);
      halt(0);
    end;
  end;

  (* Установить обработчик таймера *)
  act.handler.sh := @setflag;
  sigaction (SIGALRM, @act, nil);
  (* Установить таймер *)
  alarm (nsecs);
  (* Приостановить выполнение до получения сигнала ... *)
  pause;

  (* Если был получен сигнал SIGALRM, вывести сообщение *)
  if alarm_flag then
  begin
    write(BELLS);
    for j := 2 to paramcount do
      write(paramstr(j),' ');
    writeln;
  end;
  halt(0);
end.
