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



         

Описание - часть 4


  end;

  (* Поиск программы, которую нужно завершить *)

  while fgets (inbuf, LINESZ, f) <> nil do

  begin

    if sscanf (inbuf, fmt, [@pid, pchar(name)]) < 2 then

      break;

    for j := 2 to argc-1 do

    begin

      if strcomp (name, argv[j]) = 0 then

      begin

        if dokill (pid, inbuf, header) = SUCCESS then

          inc(killflag);

      end;

    end;

  end;

  (* Это предупреждение, а не ошибка *)

  if killflag=0 then

    writeln(stderr, paramstr(0),': работа программы не завершена ',

            paramstr(1));

  pipeclose(f);

  halt (0);

end.

Ниже приведена реализация процедуры dokill, вызываемой программой unfreeze. Обратите внимание на использование процедуры readln для чтений первого не пробельного символа (вместо нее можно было бы использовать и функцию

yesno, представленную в разделе 11.8).

(* Получить подтверждение, затем завершить работу программы *)

function dokill(procid:longint;line,hd:pchar):integer;

var

  c:char;

begin

  writeln (#$a'Найден процесс, выполняющий заданную программу :');

  writeln (#9,hd,#9,line);

  writeln ('Нажмите `y` для завершения процесса ', procid);

  write (#$a'Yes\No? > ');

  (* Введите следующий не пробельный символ *)

  readln (c);

  if (c = 'y') or (c = 'Y') then

  begin

    kill (procid, SIGKILL);

    dokill:=SUCCESS;

    exit;

  end;

  dokill:=ERROR;

end;

Упражнение 11.9. Напишите свою версию процедуры getcwd, которая возвращает строку с именем текущего рабочего каталога. Назовите вашу программу wdir. Совет: используйте стандартную команду pwd.

Упражнение 11.10. Напишите программу arrived, которая запускает программу who при помощи процедуры popen для проверки (с 60-секундными интервалами), находится ли в системе пользователи из заданного списка. Список пользователей должен передаваться программе arrived в качестве аргумента командной строки. При обнаружении кого-нибудь из перечисленных в списке пользователей, программа arrived должна выводить сообщение. Программа должна быть достаточно эффективной, для этого используйте вызов sleep между выполнением проверок. Программа who должна быть описана в справочном руководстве системы.




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