PERLIPC(1)               USER COMMANDS                 PERLIPC(1)



NAME
     perlipc - Perl のプロセス間通信

DESCRIPTION
     Perl の IPC 機能は、バークレイのソケット機構の上に構築されて
     います。 ソケットが無い場合には、この節は無視してください。
     呼び出す関数の名前は対応するシステムコールの名前と同一ですが、
     2 つの理由により引数は異なる傾向にあります。 まず、Perl の
     ファイルハンドルは C のファイルディスクリプタと異なる動作を
     すること。 もう一つは、Perl は常に文字列の長さを知っている
     ので、長さの情報を改めて渡す必要がないことです。

     クライアント/サーバ通信

     TCP クライアントの例を示します。

         ($them,$port) = @ARGV;
         $port = 2345 unless $port;
         $them = 'localhost' unless $them;

         $SIG{'INT'} = 'dokill';
         sub dokill { kill 9,$child if $child; }

         use Socket;

         $sockaddr = 'S n a4 x8';
         chop($hostname = `hostname`);

         ($name, $aliases, $proto) = getprotobyname('tcp');
         ($name, $aliases, $port) = getservbyname($port, 'tcp')
             unless $port =~ /^\d+$/;
         ($name, $aliases, $type, $len, $thisaddr) =
                         gethostbyname($hostname);
         ($name, $aliases, $type, $len, $thataddr) = gethostbyname($them);

         $this = pack($sockaddr, &AF_INET, 0, $thisaddr);
         $that = pack($sockaddr, &AF_INET, $port, $thataddr);

         socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!";
         bind(S, $this) || die "bind: $!";
         connect(S, $that) || die "connect: $!";

         select(S); $| = 1; select(stdout);












Perl manpages Last change: Release 5.0 Patchlevel 00            1






PERLIPC(1)               USER COMMANDS                 PERLIPC(1)



         if ($child = fork) {
             while (<>) {
                 print S;
             }
             sleep 3;
             do dokill();
         }
         else {
             while (<S>) {
                 print;
             }
         }

     そしてサーバです:

         ($port) = @ARGV;
         $port = 2345 unless $port;

         use Socket;

         $sockaddr = 'S n a4 x8';

         ($name, $aliases, $proto) = getprotobyname('tcp');
         ($name, $aliases, $port) = getservbyname($port, 'tcp')
             unless $port =~ /^\d+$/;

         $this = pack($sockaddr, &AF_INET, $port, "\0\0\0\0");

         select(NS); $| = 1; select(stdout);

         socket(S, &PF_INET, &SOCK_STREAM, $proto) || die "socket: $!";
         bind(S, $this) || die "bind: $!";
         listen(S, 5) || die "connect: $!";

         select(S); $| = 1; select(stdout);

         for (;;) {
             print "Listening again\n";
             ($addr = accept(NS,S)) || die $!;
             print "accept ok\n";

             ($af,$port,$inetaddr) = unpack($sockaddr,$addr);
             @inetaddr = unpack('C4',$inetaddr);
             print "$af $port @inetaddr\n";

             while (<NS>) {
                 print;
                 print NS;
             }
         }





Perl manpages Last change: Release 5.0 Patchlevel 00            2






PERLIPC(1)               USER COMMANDS                 PERLIPC(1)



     SysV IPC

     共有メモリ使用状況を示す例です:

         $IPC_PRIVATE = 0;
         $IPC_RMID = 0;
         $size = 2000;
         $key = shmget($IPC_PRIVATE, $size , 0777 );
         die if !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 "$!";

     セマフォの例です:

         $IPC_KEY = 1234;
         $IPC_RMID = 0;
         $IPC_CREATE = 0001000;
         $key = semget($IPC_KEY, $nsems , 0666 | $IPC_CREATE );
         die if !defined($key);
         print "$key\n";

     このコードを独立したファイルに納めて、少なくとも一つのプロセ
     スで実行するようにします。 このファイルを take とします。
     (訳注: 意味が通じないので想像を含めています。)

         # セマフォの生成

         $IPC_KEY = 1234;
         $key = semget($IPC_KEY,  0 , 0 );
         die if !defined($key);

         $semnum = 0;
         $semflag = 0;

         # セマフォの「取得」'take'
         # セマフォが 0 になるのを待つ
         $semop = 0;
         $opstring1 = pack("sss", $semnum, $semop, $semflag);

         # セマフォのカウントをインクリメント
         $semop = 1;
         $opstring2 = pack("sss", $semnum, $semop,  $semflag);
         $opstring = $opstring1 . $opstring2;

         semop($key,$opstring) || die "$!";



Perl manpages Last change: Release 5.0 Patchlevel 00            3






PERLIPC(1)               USER COMMANDS                 PERLIPC(1)



     このコードを独立したファイルに納めて、少なくとも一つのプロセ
     スで実行するようにします。 このファイルを give とします。
     (訳注: 意味が通じないので想像を含めています。)

         # セマフォの「提供」'give'
         # これを元のプロセスで実行すると、続くプロセスが、引き継
         # ぎます。

         $IPC_KEY = 1234;
         $key = semget($IPC_KEY, 0, 0);
         die if !defined($key);

         $semnum = 0;
         $semflag = 0;

         # セマフォのカウントをデクリメント
         $semop = -1;
         $opstring = pack("sss", $semnum, $semop, $semflag);

         semop($key,$opstring) || die "$!";



































Perl manpages Last change: Release 5.0 Patchlevel 00            4