您的位置:首页 > 其它

[总结]IPC之管道

2011-05-31 14:20 274 查看
服务端:

#!/usr/bin/perl -w
use strict;
use warnings;
use IO::Socket;
my $server = IO::Socket::INET->new(
Proto => 'tcp',
LocalPort => 8125,
Listen => 1,
Reuse => 1,
) or die $!;

while (my $client = $server->accept())
{
$client->autoflush(1);
print "Welcome " . $client->peerhost . "/n";

my $pid = open(my $fh_read, "-|") or warn $!;
if ($pid)
{ # parent
while (<$fh_read>)
{
print $client $_ or die $!;
}
#close($fh_read) || warn "kid exited $?";
}
else
{ # child
exec("date")
|| die "can't exec program: $!";
}
print $client "Goodbye./n";
#$client->close();
}

$server->close();


1.在while循环条件中,将$client定义为私有my,可以防止最后忘记close($client);,从而导致客户端阻塞。

注意要在while循环条件中定义成my,如果在外面定义成私有,最后还是需要调用close($client)。

 open也有这样的用法,将文件描述符$fh定义为私有my,最后程序也会自动close($fh)。

以上程序的close(),我都屏蔽了,程序正常运行。

2.不知道为什么,我在open一个管道时,会报Illegal seek,至今原因不明。

打开一个管道也可以用pipe,不过我习惯open这种方式,“-|”表示打开读的管道,“|-”表示打开写的管道。

3.向客户端发送数据时,记得最后一定要有回车分隔。

print $client $_中的$_是由exec结果所得,该字符串默认有/n结尾。

客户端:

#!/usr/bin/perl -w
use strict;
use warnings;
use IO::Socket;
my $host = '135.242.102.32';
my $socket = IO::Socket::INET->new(
Proto => 'tcp',
PeerAddr => $host,
PeerPort => 8125,
) or die $!;
$socket->autoflush(1);
#while ( <$socket> ) { print }
print <$socket>;
close $socket;


客户端比较简单,接受服务端的消息方法有

1.单条消息用 my $message = <$server>;

2.多条消息用 my @message = <$server>;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: