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