home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl502b.zip / eg / sysvipc / ipcsem < prev    next >
Text File  |  1994-10-18  |  858b  |  47 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/msg.ph';
  7.  
  8. $| = 1;
  9.  
  10. $mode = shift;
  11. die "usage: ipcmsg {r|s}\n" unless $mode =~ /^[rs]$/;
  12. $signal = ($mode eq "s");
  13.  
  14. $id = semget(0x1234, 1, ($signal ? 0 : &IPC_CREAT) | 0644);
  15. die "Can't get semaphore: $!\n" unless defined($id);
  16. print "semaphore id: $id\n";
  17.  
  18. if ($signal) {
  19.     while (<STDIN>) {
  20.         print "Signalling\n";
  21.         unless (semop($id, 0, pack("sss", 0, 1, 0))) {
  22.             die "Can't signal semaphore: $!\n";
  23.         }
  24.     }
  25. }
  26. else {
  27.     $SIG{'INT'} = $SIG{'QUIT'} = "leave";
  28.     for (;;) {
  29.         unless (semop($id, 0, pack("sss", 0, -1, 0))) {
  30.             die "Can't wait for semaphore: $!\n";
  31.         }
  32.         print "Unblocked\n";
  33.     }
  34. }
  35.  
  36. &leave;
  37.  
  38. sub leave {
  39.     if (!$signal) {
  40.         $x = semctl($id, 0, &IPC_RMID, 0);
  41.         if (!defined($x) || $x < 0) {
  42.             die "Can't remove semaphore: $!\n";
  43.         }
  44.     }
  45.     exit;
  46. }
  47.