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


         

Чтобы процедура writer не была


    (* Чтобы процедура writer не была приостановлена. *)
    if buf1^.d_nread <= 0 then
      exit;
    buf2^.d_nread := fdread (0, buf2^.d_buf, SIZ);
    semop (semid, @v2, 1);
    semop (semid, @p1, 1);
    if buf2^.d_nread <= 0 then
      exit;
  end;
end;
Структуры sembuf просто определяют операции р() и v() для набора из
двух семафоров. Но на этот раз они используются не для блокировки критических участков кода, а для синхронизации процедур, выполняющих чтение и запись. Процедура reader использует операцию v2 для сообщения о том, что она завершила чтение и ожидает, вызвав semop с параметром р1, пока процедура writer сообщит о завершении записи. Это станет более очевидным при описании процедуры writer. Возможны другие подходы, включающие или четыре бинарных семафора, или семафоры, имеющие более двух значений.
Последней процедурой, вызываемой программой
shmcopy, является процедура writer:
{$i share_ex.inc}
(* Процедура writer - выполняет запись *)
procedure writer(semid:longint;buf1,buf2:pdatabuf);
begin
  while true do
  begin
    semop (semid, @p1, 1);
    semop (semid, @v2, 1);
    if buf1^.d_nread <= 0 then
      exit;
    fdwrite (1, buf1^.d_buf, buf1^.d_nread);
    semop (semid, @p2, 1);
    semop (semid, @v1, 1);
    if buf2^.d_nread <= 0 then
      exit;
    fdwrite (1, buf2^.d_buf, buf2^.d_nread);
  end;
end;
И снова следует обратить внимание на использование набора семафоров для согласования работы процедур reader и writer. На этот раз процедура writer использует операцию v2
для сигнализации и ждет р1. Важно также отметить, что значения buf1^.d_nread и buf2^.d_nread устанавливаются процессом, выполняющим чтение.
После компиляции можно использовать программу
shmcopy при помощи подобной команды:
$ shmcopy < big > /tmp/big
Упражнение 8.6. Усовершенствуйте обработку ошибок и вывод сообщений в программе shmcopy (в особенности для вызовов fdread и fdwrite). Сделайте так, чтобы программа shmcopy принимала в качестве аргументов имена файлов в форме команды cat. Какие последствия возникнут при прерывании программы shmcopy? Можете ли вы улучшить поведение программы?
Упражнение 8.7. Придумайте систему передачи сообщений, использующую разделяемую память. Измерьте ее производительность и сравните с производительностью стандартных процедур передачи сообщений.

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