shmtool.pp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. Program shmtool;
  2. uses ipc,strings,Baseunix;
  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 shmctl (shmid,IPC_STAT,@data)=-1 then
  37. begin
  38. writeln ('Error : shmctl :',fpgeterrno);
  39. halt(1);
  40. end;
  41. writeln ('Old permissions : ',data.shm_perm.mode);
  42. data.shm_perm.mode:=m;
  43. If shmctl (shmid,IPC_SET,@data)=-1 then
  44. begin
  45. writeln ('Error : shmctl :',fpgeterrno);
  46. halt(1);
  47. end;
  48. writeln ('New permissions : ',data.shm_perm.mode);
  49. end;
  50. const ftokpath = '.'#0;
  51. begin
  52. if paramcount<1 then usage;
  53. key := ftok (pchar(@ftokpath[1]),ord('S'));
  54. shmid := shmget(key,segsize,IPC_CREAT or IPC_EXCL or 438);
  55. If shmid=-1 then
  56. begin
  57. Writeln ('Shared memory exists. Opening as client');
  58. shmid := shmget(key,segsize,0);
  59. If shmid = -1 then
  60. begin
  61. Writeln ('shmget : Error !',fpgeterrno);
  62. halt(1);
  63. end
  64. end
  65. else
  66. Writeln ('Creating new shared memory segment.');
  67. segptr:=shmat(shmid,nil,0);
  68. if longint(segptr)=-1 then
  69. begin
  70. Writeln ('Shmat : error !',fpgeterrno);
  71. halt(1);
  72. end;
  73. case upcase(paramstr(1)[1]) of
  74. 'W' : writeshm (shmid,segptr,paramstr(2));
  75. 'R' : readshm (shmid,segptr);
  76. 'D' : removeshm(shmid);
  77. 'M' : changemode (shmid,paramstr(2));
  78. else
  79. begin
  80. writeln (paramstr(1));
  81. usage;
  82. end;
  83. end;
  84. end.