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


         

к конкретной системе. Это связано


Программа ps
сильно привязана к конкретной системе. Это связано с тем, что она напрямую обращается к ядру (через специальный файл, представляющий образ системной памяти) для получения системной таблицы процессов. На системе, использованной при разработке этого примера, команда ps
имеет синтаксис
$ ps -t ttyname
где ttyname является именем специального файла терминала в каталоге /dev, например, tty1, console, pts/8 и др. Выполнение этой команды ps
дает следующий вывод:
PID TTY TIME  COMMAND
29  со  0:04  sh
39  со  0:49  vi
42  со  0:00  sh
43  со  0:01  ps
Первый столбец содержит идентификатор процесса. Второй – имя терминала, в данном случае со
соответствует консоли. В третьем столбце выводится суммарное время выполнения процесса. В последнем, четвертом, столбце выводится имя выполняемой программы. Обратите внимание на первую строку, которая является заголовком. В программе unfreeze, текст которой приведен ниже, нам потребуется ее пропустить.
(* Программа unfreeze - освобождение терминала *)
uses stdio,linux,strings;
const
  LINESZ =150;
  SUCCESS=0;
  ERROR  =(-1);
const
  killflag:integer=0;
  (* Инициализация этой переменной зависит от вашей системы *)
  pspart:pchar = 'ps t ';
  fmt:pchar = '%d %*s %*s %*s %s';
var
  comline, inbuf, header, name:array [0..LINESZ-1] of char;
  f:pfile; 
  j:integer;
  pid:longint;
begin
  if paramcount <2 then
  begin
    writeln (stderr, 'синтаксис: ',paramstr(0),' терминал программа ...');
    halt (1);
  end;
  (* Сборка командной строки *)
  strcopy (comline, pspart);
  strcat (comline, argv[1]);
  (* Запуск команды ps *)
  f := pipeopen (comline, 'r');
  if f = nil then
  begin
    writeln (stderr, paramstr(0),': не могу запустить команду ps ');
    halt (2);
  end;
  (* Получить первую строку от ps и игнорировать ее *)
  if fgets (header, LINESZ, f) = nil then
  begin
    writeln (stderr, paramstr(0),': нет вывода от ps?');
    halt (3);

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