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


         

Ниже следует главная функция для


Ниже следует главная функция для программы shmcopy. Она вызывает процедуры инициализации, а затем создает процесс для чтения (родительский) и для записи (дочерний). Обратите внимание на то, что именно выполняющий запись процесс вызывает процедуру remobj при завершении программы.
(* Программа shmcopy - главная функция *)
uses ipc,stdio,linux;
{$i share_ex.inc}
var
  pid : longint;
  buf1, buf2 : pdatabuf;
begin
  (* Инициализация набора семафоров. *)
  semid := getsem;
  (* Создать и подключить участки разделяемой памяти. *)
  getseg (buf1, buf2);
  pid := fork;
  case pid of
    -1:
      fatal ('fork');
    0:                (* дочерний процесс *)
    begin
      writer (semid, buf1, buf2);
      remobj;
    end;
    else                (* родительский процесс *)
      reader (semid, buf1, buf2);
  end;
  halt (0);
end.
Программа создает объекты межпроцессного взаимодействия до вызова fork. Обратите внимание на то, что адреса, определяющие сегменты разделяемой памяти (которые находятся в переменных buf1 и buf2), будут заданы в обоих процессах.
Процедура reader принимает данные со стандартного ввода, то есть из дескриптора файла 0, и является первой функцией, представляющей интерес. Ей передается идентификатор набора семафоров в параметре semid и адреса двух участков разделяемой памяти в переменных buf1 и buf2.
{$i share_ex.inc}
(* Определения процедур p() и v() для двух семафоров *)
const
  p1:tsembuf=(sem_num:0;sem_op:-1;sem_flg:0);
  p2:tsembuf=(sem_num:1;sem_op:-1;sem_flg:0);
  v1:tsembuf=(sem_num:0;sem_op:1;sem_flg:0);
  v2:tsembuf=(sem_num:1;sem_op:1;sem_flg:0);
(* Процедура reader - выполняет чтение из файла *)
procedure reader(semid:longint;buf1,buf2:pdatabuf);
begin
  while true do
  begin
    (* Считать в буфер buf1 *)
    buf1^.d_nread := fdread (0, buf1^.d_buf, SIZ);
    (* Точка синхронизации *)
    semop (semid, @v1, 1);
    semop (semid, @p2, 1);

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