免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7486 | 回复: 6
打印 上一主题 下一主题

关于waitpid的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-16 10:54 |只看该作者 |倒序浏览
我在写Socket程序时,在服务端用如下语句,对fork调用派生的子进程进行处理。
use POSIX 'WNOHANG';
$SIG{CHLD}=sub {while (waitpid(-1,WNOHANG)>;0) {}}
但是每次都不能进行第二次连接。服务端程序只能运行一次便退出,可是去掉这两句一切正常。这是什么原因?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-04-16 13:17 |只看该作者

关于waitpid的问题!

貼一下code吧..
你的server是用standalone,wait,nowait..
那種方式啟動??照理講你的寫法沒錯...
應該不會有問題才對...

论坛徽章:
0
3 [报告]
发表于 2003-04-16 15:36 |只看该作者

关于waitpid的问题!

只是一个简单的程序,让大家见笑了。
#!/usr/bin/perl
use IO::Socket;
$sock=IO::Socket::INET->;new(LocalHost=>;'192.168.0.189',LocalPort=>;'5555',Reuse=>;1,Listen=>;5);
while ($acc=$sock->;accept()) {
        $pid=fork();
        if ($pid==0) {
                close $sock;
                while ($data=<$acc> {
                        SWITCH: {
                                if ($data eq "quit\r\n" { exit(1);}
                                if ($data eq "host\r\n" {print $acc $acc->;peerhost(),"\n";last SWITCH;}
                                if ($data eq "port\r\n" {print $acc $acc->;peerport(),"\n";last SWITCH;}
                        }
                }
                close ($acc);
        }
        close ($acc);
}
close $sock;

论坛徽章:
0
4 [报告]
发表于 2003-04-16 15:36 |只看该作者

关于waitpid的问题!

只是一个简单的程序,让大家见笑了。
#!/usr/bin/perl
use IO::Socket;
use POSIX 'WNOHANG';
$SIG{CHLD}=sub {while (waitpid(-1,WNOHANG)>;0) {}}
$sock=IO::Socket::INET->;new(LocalHost=>;'192.168.0.189',LocalPort=>;'5555',Reuse=>;1,Listen=>;5);
while ($acc=$sock->;accept()) {
        $pid=fork();
        if ($pid==0) {
                close $sock;
                while ($data=<$acc> {
                        SWITCH: {
                                if ($data eq "quit\r\n" { exit(1);}
                                if ($data eq "host\r\n" {print $acc $acc->;peerhost(),"\n";last SWITCH;}
                                if ($data eq "port\r\n" {print $acc $acc->;peerport(),"\n";last SWITCH;}
                        }
                }
                close ($acc);
        }
        close ($acc);
}
close $sock;

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-04-16 17:21 |只看该作者

关于waitpid的问题!

#!/usr/bin/perl
use IO::Socket;
use POSIX 'WNOHANG';
$SIG{CHLD}=sub {while (waitpid(-1,WNOHANG)>;0) {}};
$SIG{INT}=sub{ $quit++;};
#$sock=IO::Socket::INET->;new(
#  LocalHost=>;'10.144.43.175',LocalPort=>;'5555',Reuse=>;1,Listen=>;5);
$sock=IO::Socket::INET->;new(
   LocalPort=>;'5555',Listen=>;20,Proto=>;'tcp',Reuse=>;1);
die "can't create a listening socket: $@" unless $sock;
warn "Server ready. Waiting for connections ...\n";

while (!$quit){
next unless my $acc=$sock->;accept;

defined($pid=fork()) or die "can't fork!";

if ($pid==0) {
close $sock;
  STDIN->;fdopen($acc,"<" or die "can't reopen STDIN: $!";
  STDOUT->;fdopen($acc,">;" or die "can't reopen STDOUT: $!";
  STDERR->;fdopen($acc,">;" or die "can't reopen STDERR: $!";
  $|=1;

while ($data=<$acc> {
SWITCH: {
if ($data eq "quit\r\n" { exit(1);}
if ($data eq "host\r\n" {print $acc $acc->;peerhost(),"\n";last SWITCH;}
if ($data eq "port\r\n" {print $acc $acc->;peerport(),"\n";last SWITCH;}
}
}
close ($acc);
}
close ($acc);
}
close $sock;


我改好後的程序碼..你的程序碼..怪怪的..

论坛徽章:
0
6 [报告]
发表于 2003-04-17 08:17 |只看该作者

关于waitpid的问题!

非常感谢!我试了一下,好像只要把$SIG{INT}=sub{ $quit++;};
处理程序加上,就正常了,不知道什么原因?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
7 [报告]
发表于 2003-04-17 16:26 |只看该作者

关于waitpid的问题!

while ($acc=$sock->;accept()) {
$pid=fork();
關鍵在你的代碼中的這兩行....
$acc=$sock->;accept();
因為$sock->;accept不一定會accept到..
所以如果你這樣寫..當然只會accept一次就斷掉了..
因為有可能$acc=false就直接跳出迴圈了....

所以我的代碼中有
while(!$quit){
next unless my $acc=$sock->;accept;
}

另外你的代碼我執行的時候如果沒加
$SIG{CHLD}這個處理..會有Zombie產生...
而且一個connection就產生一個Zombie...

$SIG{INT} 是當我從console上對 server送出INT Signal
的時候,將$quit數值變成1..如此..
while(!$quit) 就會等於false..server就會自動停止..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP