Поиск программы, которую нужно завершить
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 должна быть описана в справочном руководстве системы.
Содержание Назад Вперед