免费注册 查看新帖 |

Chinaunix

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

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-03-31 15:37 |只看该作者 |倒序浏览
想在command下测试fork多个子进程,当好像每次都是2的n次方,代码如下:
BBcode[ code]
#!/usr/bin/perl
use IO::Socket;
die "Usage0 num" if @ARGV<1;
my $num=shift;
for(my $i=0;$i<$num;$i++){
defined(my $child=fork()) or die "Can't fork!\n";
next;
}
if ($child==0) {
$sock=IO::Socket::INET->;new( PeerHost=>;'192.192.191.134',
                        PeerPort        =>;12000,
                        Proto           =>;'tcp')
                        or die "Can't connect socket@\n";

my $answer=<$sock>;;
print "$$:Answer is $answer\n";
close $sock;
}
[ /code]
是何故?不解   

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

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的


  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. die "Usage:$0 num" if @ARGV<1;
  4. my $num=shift;
  5. for(my $i=0;$i<$num;$i++){
  6. defined(my $child=fork()) or die "Can't fork!\n";
  7. next;
  8. }
  9. if ($child==0) {
  10. $sock=IO::Socket::INET->;new( PeerHost=>;'192.192.191.134',
  11. PeerPort =>;12000,
  12. Proto =>;'tcp')
  13. or die "Can't connect socket:$@\n";

  14. my $answer=<$sock>;;
  15. print "$$:Answer is $answer\n";
  16. close $sock;
  17. }
复制代码


第一..邏輯不對....
if($child==0){
應該要在
fork後面馬上就做....不能在迴圈外面
判斷...
第二..你沒有 catch CHLD signal
Parent Process將無法替Child Process回收memory與Process....
所以你看的process應該是你先前產生的..並非n次法個...
先去看看相關的書籍吧....

论坛徽章:
0
3 [报告]
发表于 2004-04-02 11:49 |只看该作者

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的

多谢apile,我修改如下:
[code][/code]
#!/usr/bin/perl
use IO::Socket;
use POSIX;
die "Usage0 num" if @ARGV<1;
$SIG{CHLD}=sub{ while (waitpid(-1,WNOHANG)>;0) {} };
my $num=shift;
for(my $i=0;$i<$num;$i++){
defined(my $child=fork()) or die "Can't fork!\n";
if ($child==0) {
$sock=IO::Socket::INET->;new( PeerHost=>;'192.192.191.134',
PeerPort =>;12000,
Proto =>;'tcp')
or die "Can't connect socket@\n";

my $answer=<$sock>;;
print "$$:Answer is $answer\n";
close $sock;
}
}
但还是有2的n次方-1个子进程

论坛徽章:
0
4 [报告]
发表于 2004-04-02 13:30 |只看该作者

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的

因为fork完后的子进程就不应该继续fork了,儿子又生了孙子.

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

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的

child process的那段最後應該要exit;
不然他不會被回收....see??

论坛徽章:
0
6 [报告]
发表于 2004-04-02 16:59 |只看该作者

fork并发子进程为何总是2的n次方,我的本意是forkn个子进程的

谢谢两位,可以了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP