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