(对我来说(PERL在没有错误的情况下崩溃了,但(对我而言(我一定做错了什么。一切看起来都很奇怪,因为PERL在没有错误的情况下退出中间代码,它不应该。。。除非我错了。。。我可能是…这就是为什么我请求帮助!
我已经确认,下面的代码显示出与原始CENTOS8(我使用的是Rocky(系统相同的行为,并且它EXITS。。。请有人帮我解释一下为什么我真的不知道发生了什么,所以我请求帮助!
两个简单的PERL程序:
./listen_socket.pl
./send_socket.pl sending_this
发送套接字实际上是一个简单的netcat。。。nc
NETCAT工作。。。。如果我使用:
echo send_this | nc -U /tmp/whydontyouwork.sock
那么";listen_socket.pl";未退出,并且行为符合预期。如果我执行这个:
./send_socket.pl send_this
那么它就失败了。
我不明白为什么。请帮帮我,告诉我哪里是白痴,因为我不知道
下面是两个perl程序:(listen_socket.pl(和(send_socketpl(
listen_socket.pl:
use warnings;
use IO::Select;
use IO::Socket::UNIX;
my $SOCK_PATH = "/tmp/whydontyouwork.sock";
my $socket;
my $sel = IO::Select->new();
unlink $SOCK_PATH;
setup();
main();
print STDERR "I know I never get here...see below..n";
sub setup {
$socket = new IO::Socket::UNIX(
Type => SOCK_STREAM,
Local => $SOCK_PATH,
Listen => 5,
);
$sel->add($socket);
}
sub main {
while ( 1 == 1 ) {
while(my @ready = $sel->can_read(1)) {
foreach my $fh (@ready) {
if($fh == $socket) {
# Create a new socket
my $new = $socket->accept;
$sel->add($new);
}
else {
# Process socket
if ( 1 == 1 ) {
my $data = <$fh>;
if ( defined $data ) {
print STDERR "I am here...I GET HERE!!";
print $fh "n";
print STDERR "..and all done and I NEVER GET HERE!!??.n";
$sel->remove($fh);
$fh->close;
}
}
print STDERR "Howdie here? Nope..n";
}
}
}
}
}
send_socket.pl:
#!/usr/bin/perl
use Socket;
my $SOCK_PATH = "/tmp/whydontyouwork.sock";
if ( $ARGV[0] ) {
socket(CLIENT, PF_UNIX, SOCK_STREAM, 0);
connect(CLIENT, sockaddr_un($SOCK_PATH));
print CLIENT $ARGV[0] ;
close CLIENT;
exit;
}
exit 1;
WORKS==>echo send_this | nc -U /tmp/whydontyouwork.sock
无效===>perl ./send_socket.pl send_this
您应该添加每次运行的输出,至少告诉我们侦听器死于Broken pipe
,这会让您的问题更加明显。
在任何情况下,看起来发送方正在关闭套接字,然后侦听器正在尝试对其进行写入
从技术上讲,您可以忽略断开的管道,并通过向侦听器添加$SIG{PIPE} = 'IGNORE';
使perl示例的输出相同,但这当然不能解决(缺乏(逻辑的问题。
但是,实际上,你应该多读一些关于使用套接字编程的知识,因为你试图做的事情没有多大意义,更重要的是,你实际上应该注意错误消息,以获得正在发生的事情的提示。