shmtool.pp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. Program shmtool;
  2. uses ipc,strings;
  3. Const SegSize = 100;
  4. var key : Tkey;
  5. shmid,cntr : longint;
  6. segptr : pchar;
  7. Procedure USage;
  8. begin
  9. Writeln ('Usage : shmtool w(rite) text');
  10. writeln (' r(ead)');
  11. writeln (' d(elete)');
  12. writeln (' m(ode change) mode');
  13. halt(1);
  14. end;
  15. Procedure Writeshm (ID : Longint; ptr : pchar; S : string);
  16. begin
  17. strpcopy (ptr,s);
  18. end;
  19. Procedure Readshm(ID : longint; ptr : pchar);
  20. begin
  21. Writeln ('Read : ',ptr);
  22. end;
  23. Procedure removeshm (ID : Longint);
  24. begin
  25. shmctl (ID,IPC_RMID,Nil);
  26. writeln ('Shared memory marked for deletion');
  27. end;
  28. Procedure CHangeMode (ID : longint; mode : String);
  29. Var m : word;
  30. code : integer;
  31. data : TSHMid_ds;
  32. begin
  33. val (mode,m,code);
  34. if code<>0 then
  35. usage;
  36. If Not shmctl (shmid,IPC_STAT,@data) then
  37. begin
  38. writeln ('Error : shmctl :',ipcerror);
  39. halt(1);
  40. end;
  41. writeln ('Old permissions : ',data.shm_perm.mode);
  42. data.shm_perm.mode:=m;
  43. If Not shmctl (shmid,IPC_SET,@data) then
  44. begin
  45. writeln ('Error : shmctl :',ipcerror);
  46. halt(1);
  47. end;
  48. writeln ('New permissions : ',data.shm_perm.mode);
  49. end;
  50. begin
  51. if paramcount<1 then usage;
  52. key := ftok ('.','S');
  53. shmid := shmget(key,segsize,IPC_CREAT or IPC_EXCL or 438);
  54. If shmid=-1 then
  55. begin
  56. Writeln ('Shared memory exists. Opening as client');
  57. shmid := shmget(key,segsize,0);
  58. If shmid = -1 then
  59. begin
  60. Writeln ('shmget : Error !',ipcerror);
  61. halt(1);
  62. end
  63. end
  64. else
  65. Writeln ('Creating new shared memory segment.');
  66. segptr:=shmat(shmid,nil,0);
  67. if longint(segptr)=-1 then
  68. begin
  69. Writeln ('Shmat : error !',ipcerror);
  70. halt(1);
  71. end;
  72. case upcase(paramstr(1)[1]) of
  73. 'W' : writeshm (shmid,segptr,paramstr(2));
  74. 'R' : readshm (shmid,segptr);
  75. 'D' : removeshm(shmid);
  76. 'M' : changemode (shmid,paramstr(2));
  77. else
  78. begin
  79. writeln (paramstr(1));
  80. usage;
  81. end;
  82. end;
  83. end.