shmctl
Perform control operations on a shared memory block.
Declaration
Source position: ipc.pp line 420
  function shmctl(shmid: cint; cmd: cint; buf: PShmid_DS) : cint;
Description
shmctl performs various operations on the shared memory block identified by identifier shmid.
The buf parameter points to a TSHMid_ds record. The cmd parameter is used to pass which operation is to be performed. It can have one of the following values :
- IPC_STAT
- shmctl fills the TSHMid_ds record that buf points to with the available information about the shared memory block.
- IPC_SET
- applies the values in the ipc_perm record that buf points to, to the shared memory block.
- IPC_RMID
- the shared memory block is destroyed (after all processes to which the block is attached, have detached from it).
If successful, the function returns True, False otherwise.
Errors
If an error occurs, the function returns False, and IPCerror is set.
See also
| Name | Description | 
|---|---|
| shmat | Attach a shared memory block. | 
| shmdt | Detach shared memory block. | 
| shmget | Return the ID of a shared memory block, possibly creating it | 
Example
Program shmtool;
uses ipc,strings,Baseunix;
Const SegSize = 100;
var key : Tkey;
    shmid,cntr : longint;
    segptr : pchar;
Procedure USage;
begin
 Writeln ('Usage : shmtool w(rite) text');
 writeln ('                r(ead)');
 writeln ('                d(elete)');
 writeln ('                m(ode change) mode');
 halt(1);
end;
Procedure Writeshm (ID : Longint; ptr : pchar; S : string);
begin
  strpcopy (ptr,s);
end;
Procedure Readshm(ID : longint; ptr : pchar);
begin
  Writeln ('Read : ',ptr);
end;
Procedure removeshm (ID : Longint);
begin
  shmctl (ID,IPC_RMID,Nil);
  writeln ('Shared memory marked for deletion');
end;
Procedure CHangeMode (ID : longint; mode : String);
Var m : word;
    code : integer;
    data : TSHMid_ds;
begin
  val (mode,m,code);
  if code<>0 then
    usage;
  If shmctl (shmid,IPC_STAT,@data)=-1 then
    begin
     writeln ('Error : shmctl :',fpgeterrno);
     halt(1);
    end;
  writeln ('Old permissions : ',data.shm_perm.mode);
  data.shm_perm.mode:=m;
  If shmctl (shmid,IPC_SET,@data)=-1 then
    begin
    writeln ('Error : shmctl :',fpgeterrno);
    halt(1);
    end;
  writeln ('New permissions : ',data.shm_perm.mode);
end;
const ftokpath = '.'#0;
begin
  if paramcount<1 then usage;
   key := ftok (pchar(@ftokpath[1]),ord('S'));
  shmid := shmget(key,segsize,IPC_CREAT or IPC_EXCL or 438);
  If shmid=-1 then
    begin
    Writeln ('Shared memory exists. Opening as client');
    shmid := shmget(key,segsize,0);
    If shmid = -1 then
      begin
      Writeln ('shmget : Error !',fpgeterrno);
      halt(1);
      end
    end
  else
    Writeln ('Creating new shared memory segment.');
  segptr:=shmat(shmid,nil,0);
  if longint(segptr)=-1 then
    begin
    Writeln ('Shmat : error !',fpgeterrno);
    halt(1);
    end;
  case upcase(paramstr(1)[1]) of
    'W' : writeshm (shmid,segptr,paramstr(2));
    'R' : readshm (shmid,segptr);
    'D' : removeshm(shmid);
    'M' : changemode (shmid,paramstr(2));
  else
    begin
    writeln (paramstr(1));
    usage;
    end;
  end;
end.