home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl502b.zip / eg / sysvipc / ipcmsg next >
Text File  |  1994-10-18  |  880b  |  48 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. $send = ($mode eq "s");
  13.  
  14. $id = msgget(0x1234, ($send ? 0 : &IPC_CREAT) | 0644);
  15. die "Can't get message queue: $!\n" unless defined($id);
  16. print "message queue id: $id\n";
  17.  
  18. if ($send) {
  19.     while (<STDIN>) {
  20.         chop;
  21.         unless (msgsnd($id, pack("LA*", $., $_), 0)) {
  22.             die "Can't send message: $!\n";
  23.         }
  24.     }
  25. }
  26. else {
  27.     $SIG{'INT'} = $SIG{'QUIT'} = "leave";
  28.     for (;;) {
  29.         unless (msgrcv($id, $_, 512, 0, 0)) {
  30.             die "Can't receive message: $!\n";
  31.         }
  32.         ($type, $message) = unpack("La*", $_);
  33.         printf "[%d] %s\n", $type, $message;
  34.     }
  35. }
  36.  
  37. &leave;
  38.  
  39. sub leave {
  40.     if (!$send) {
  41.         $x = msgctl($id, &IPC_RMID, 0);
  42.         if (!defined($x) || $x < 0) {
  43.             die "Can't remove message queue: $!\n";
  44.         }
  45.     }
  46.     exit;
  47. }
  48.