home *** CD-ROM | disk | FTP | other *** search
/ c't freeware shareware 1997 / CT_SW_97.ISO / pc / software / entwickl / win95 / pw32i306.exe / eg / sysvipc / ipcshm < prev    next >
Text File  |  1994-10-18  |  1KB  |  51 lines

  1. #!/usr/bin/perl
  2. eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  3.     if 0;
  4.  
  5. require 'sys/ipc.ph';
  6. require 'sys/shm.ph';
  7.  
  8. $| = 1;
  9.  
  10. $mode = shift;
  11. die "usage: ipcshm {r|s}\n" unless $mode =~ /^[rs]$/;
  12. $send = ($mode eq "s");
  13.  
  14. $SIZE = 32;
  15. $id = shmget(0x1234, $SIZE, ($send ? 0 : &IPC_CREAT) | 0644);
  16. die "Can't get shared memory: $!\n" unless defined($id);
  17. print "shared memory id: $id\n";
  18.  
  19. if ($send) {
  20.     while (<STDIN>) {
  21.         chop;
  22.         unless (shmwrite($id, pack("La*", length($_), $_), 0, $SIZE)) {
  23.             die "Can't write to shared memory: $!\n";
  24.         }
  25.     }
  26. }
  27. else {
  28.     $SIG{'INT'} = $SIG{'QUIT'} = "leave";
  29.     for (;;) {
  30.         $_ = <STDIN>;
  31.         unless (shmread($id, $_, 0, $SIZE)) {
  32.             die "Can't read shared memory: $!\n";
  33.         }
  34.         $len = unpack("L", $_);
  35.         $message = substr($_, length(pack("L",0)), $len);
  36.         printf "[%d] %s\n", $len, $message;
  37.     }
  38. }
  39.  
  40. &leave;
  41.  
  42. sub leave {
  43.     if (!$send) {
  44.         $x = shmctl($id, &IPC_RMID, 0);
  45.         if (!defined($x) || $x < 0) {
  46.             die "Can't remove shared memory: $!\n";
  47.         }
  48.     }
  49.     exit;
  50. }
  51.