While System
V
IPC isn't so widely used as sockets, it still has some interesting uses. You can't, however, effectively use SysV
IPC or Berkeley mmap() to have shared memory so as to share a variable amongst several processes. That's because Perl would reallocate your string when you weren't wanting it to.
Here's a small example showing shared memory usage.
$IPC_PRIVATE = 0;
$IPC_RMID = 0;
$size = 2000;
$key = shmget($IPC_PRIVATE, $size , 0777 );
die unless defined $key;
$message = "Message #1";
shmwrite($key, $message, 0, 60 ) || die "$!";
shmread($key,$buff,0,60) || die "$!";
print $buff,"\n";
print "deleting $key\n";
shmctl($key ,$IPC_RMID, 0) || die "$!";
Here's an example of a semaphore:
$IPC_KEY = 1234;
$IPC_RMID = 0;
$IPC_CREATE = 0001000;
$key = semget($IPC_KEY, $nsems , 0666 | $IPC_CREATE );
die if !defined($key);
print "$key\n";
Put this code in a separate file to be run in more than one process. Call
the file take:
# create a semaphore
$IPC_KEY = 1234;
$key = semget($IPC_KEY, 0 , 0 );
die if !defined($key);
$semnum = 0;
$semflag = 0;
# 'take' semaphore
# wait for semaphore to be zero
$semop = 0;
$opstring1 = pack("sss", $semnum, $semop, $semflag);
# Increment the semaphore count
$semop = 1;
$opstring2 = pack("sss", $semnum, $semop, $semflag);
$opstring = $opstring1 . $opstring2;
semop($key,$opstring) || die "$!";
Put this code in a separate file to be run in more than one process. Call
this file give:
# 'give' the semaphore
# run this in the original process and you will see
# that the second process continues
$IPC_KEY = 1234;
$key = semget($IPC_KEY, 0, 0);
die if !defined($key);
$semnum = 0;
$semflag = 0;
# Decrement the semaphore count
$semop = -1;
$opstring = pack("sss", $semnum, $semop, $semflag);
semop($key,$opstring) || die "$!";
The SysV
IPC code above was written long ago, and it's
definitely clunky looking. It should at the very least be made to use strict
and require "sys/ipc.ph" . Better yet, check out the IPC::SysV modules on
CPAN.
If you are running under version 5.000 (dubious) or 5.001, you can still
use most of the examples in this document. You may have to remove the
use strict and some of the my() statements for 5.000, and for both you'll
have to load in version 1.2 or older of the Socket.pm module, which is included in perl5.002.
Most of these routines quietly but politely return undef when they fail instead of causing your program to die right then and there
due to an uncaught exception. (Actually, some of the new Socket conversion functions croak() on bad arguments.) It is
therefore essential that you should check the return values of these
functions. Always begin your socket programs this way for optimal success,
and don't forget to add
-T taint checking flag to the pound-bang line for servers:
#!/usr/bin/perl -w
require 5.002;
use strict;
use sigtrap;
use Socket;
All these routines create system-specific portability problems. As noted elsewhere, Perl is at the mercy of your
C libraries for much of its system behaviour. It's probably safest to assume broken SysV semantics for signals and to stick with simple
TCP and
UDP socket operations; e.g., don't try to pass open file descriptors over a local
UDP datagram socket if you want your code to stand a chance of being portable.
Because few vendors provide
C libraries that are safely re-entrant, the prudent
programmer will do little else within a handler beyond setting a numeric
variable that already exists; or, if locked into a slow (restarting) system
call, using die() to raise an exception and
longjmp(3) out. In fact, even these may in some cases cause a
core dump. It's probably best to avoid signals except where they are
absolutely inevitable. This perilous problems will be addressed in a future
release of Perl.
Tom Christiansen, with occasional vestiges of Larry Wall's original version
and suggestions from the Perl Porters.
There's a lot more to networking than this, but this should get you
started.
For intrepid programmers, the classic textbook Unix Network Programming
by Richard Stevens (published by Addison-Wesley). Note that most books on networking address networking from the perspective of a
C programmer; translation to Perl is left as an exercise for the reader.
The IO::Socket(3) manpage describes the object library, and the
Socket(3) manpage describes the low-level interface to
sockets. Besides the obvious functions in the perlfunc manpage, you should also check out the modules file at your nearest
CPAN site. (See the perlmodlib manpage or best yet, the Perl
FAQ for a description of what
CPAN is and where to get it.)
Section 5 of the modules file is devoted to ``Networking, Device Control (modems), and Interprocess Communication'', and contains numerous unbundled modules numerous networking modules, Chat and Expect operations,
CGI programming,
DCE,
FTP,
IPC,
NNTP, Proxy, Ptty,
RPC,
SNMP,
SMTP, Telnet, Threads, and ToolTalk--just to name a few.
|