看起來(對我而言)PERL 在沒有錯誤的情況下崩潰,但看起來(對我而言)我一定是做錯了什么。一切看起來都很奇怪,因為 PERL在沒有錯誤的情況下退出中間代碼,它不應該......除非我錯了......可能我錯了......這就是我尋求幫助的原因!
我已經確認下面的代碼與原始 CENTOS 8(我使用 Rocky)系統表現出相同的行為并且它退出了......請有人幫助我并解釋為什么我真的不知道發生了什么事情所以我我正在尋求幫助!
兩個簡單的 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_socket.pl)
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;
作業 ==>
echo send_this | nc -U /tmp/whydontyouwork.sock
不作業 ==>
perl ./send_socket.pl send_this
uj5u.com熱心網友回復:
您應該添加每次運行的輸出,至少告訴我們偵聽器死了,Broken pipe這會使您的問題更加明顯。
無論如何,看起來您的發送者正在關閉套接字,然后偵聽器正在嘗試寫入它。
您可以在技術上忽略損壞的管道,并通過添加$SIG{PIPE} = 'IGNORE';到偵聽器讓您的輸出與 perl 示例相同,但這當然不能解決(缺少)邏輯。
但是,實際上,您應該閱讀更多有關使用套接字進行編程的內容,因為您嘗試做的事情沒有多大意義,而且更重要的是,您實際上應該注意錯誤訊息以提示正在發生的事情在。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450426.html
