Скачиваний:
17
Добавлен:
08.01.2014
Размер:
1.96 Кб
Скачать
(* рТПЗТБННБ testsem - РТПЧЕТЛБ РТПГЕДХТ ТБВПФЩ У УЕНБЖПТБНЙ *)
uses ipc,stdio,linux;
{$i pv.inc}


(* жХОЛГЙС initsem - ЙОЙГЙБМЙЪБГЙС УЕНБЖПТБ *)
function initsem(semkey:tkey):longint;
var
status, semid:longint;
arg:tsemun;
begin
status := 0;
semid := semget (semkey, 1,
SEMPERM or IPC_CREAT or IPC_EXCL);
if semid = -1 then
begin
if ipcerror = Sys_EEXIST then
semid := semget (semkey, 1, 0);
end
else
(* ЕУМЙ УЕНБЖПТ УПЪДБЕФУС ... *)
begin
arg.val := 1;
status := semctl (semid, 0, SETVAL, arg);
end;
if (semid = -1) or (status = -1) then
begin
perror ('ПЫЙВЛБ ЧЩЪПЧБ initsem');
initsem:=-1;
exit;
end;
(* чУЕ Ч РПТСДЛЕ *)
initsem:=semid;
end;

(* рТПГЕДХТБ p.pas - ПРЕТБГЙС p ДМС УЕНБЖПТБ *)
function p (semid:longint):longint;
var
p_buf:tsembuf;
begin
p_buf.sem_num := 0;
p_buf.sem_op := -1;
p_buf.sem_flg := SEM_UNDO;
if not semop (semid, @p_buf, 1) then
begin
perror ('ПЫЙВЛБ ПРЕТБГЙЙ p(semid)');
halt (1);
end;
p:=0;
end;

(* рТПГЕДХТБ v.pas - ПРЕТБГЙС v ДМС УЕНБЖПТБ *)
function v (semid:longint):longint;
var
v_buf:tsembuf;
begin
v_buf.sem_num := 0;
v_buf.sem_op := 1;
v_buf.sem_flg := SEM_UNDO;
if not semop (semid, @v_buf, 1) then
begin
perror ('пЫЙВЛБ ПРЕТБГЙЙ v(semid)');
halt (1);
end;
v:=0;
end;


procedure handlesem (skey:tkey);
var
semid, pid:longint;
begin
pid := getpid;

semid := initsem (skey);
if semid < 0 then
halt (1);

writeln (#$a'рТПГЕУУ ',pid,' РЕТЕД ЛТЙФЙЮЕУЛЙН ХЮБУФЛПН');
p (semid);
writeln ('рТПГЕУУ ',pid,' ЧЩРПМОСЕФ ЛТЙФЙЮЕУЛЙК ХЮБУФПЛ');

(* ч ТЕБМШОПК РТПЗТБННЕ ЪДЕУШ ЧЩРПМОСЕФУС ОЕЮФП ПУНЩУМЕООПЕ *)
sleep (10);

writeln ('рТПГЕУУ ',pid,' РПЛЙОХМ ЛТЙФЙЮЕУЛЙК ХЮБУФПЛ');
v (semid);
writeln ('рТПГЕУУ ',pid,' ЪБЧЕТЫБЕФ ТБВПФХ');

halt (0);
end;

const
semkey:tkey = $200;
var
i:integer;
begin
for i := 1 to 3 do
if fork = 0 then
handlesem (semkey);
end.
Соседние файлы в папке 8