免费注册 查看新帖 |

Chinaunix

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

perl 线程中可以传递文件句柄么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-03-31 13:26 |只看该作者 |倒序浏览
本帖最后由 kelvenchi 于 2013-03-31 13:26 编辑

我试着用
  1. Thread::Queue
复制代码
传递,但是失败了。怎么才能在线程间传递已经打开的文件句柄呢? 求高人解答,不甚感激。

论坛徽章:
0
2 [报告]
发表于 2013-03-31 23:33 |只看该作者
本帖最后由 kelvenchi 于 2013-04-01 10:10 编辑

问题已解决,代码如下:
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use threads 'exit' => 'thread_only';
  5. use threads::shared;
  6. use Socket;
  7. use Thread::Semaphore;
  8. use Thread::Queue;

  9. if (my $pid = fork) {
  10.         exit;
  11. } elsif ($pid = fork) {
  12.         setpgrp;
  13.         exit;
  14. } else {

  15.         my $fd    = Thread::Queue->new();
  16.         my $rabbish = Thread::Queue->new();
  17.         my $sem = Thread::Semaphore->new(100000);
  18.         my $lis = threads->create(\&boss);
  19.         my $jt = threads->create(\&joinThread);

  20.         sub worker {
  21.                 $sem->down;
  22.                 my $fino = $fd->dequeue;
  23.                 my @in;
  24.                 open my $fhh, "<tserver.pl" or die "$!";
  25.                 @in = <$fhh>;
  26.                 close $fhh or die "$!";
  27.                 open my $fh, ">&=$fino" or die "$!";   # 在这里把文件描述符,重新打开为文件句柄
  28.                 while (@in) {
  29.                         my $single = shift @in;
  30.                         print $fh "$single";
  31.                 }
  32.                 print $fh "this message is from the server and the tid is " . threads->self->tid . "\n";
  33.                 close $fh or die "$!";
  34.                 $sem->up;
  35.                 exit 1;
  36.         }

  37.         sub joinThread {
  38.                 while (my $j = $rabbish->dequeue()) {
  39.                         $j->join;
  40.                 }
  41.                 exit 1;
  42.         }

  43.         sub boss {
  44.                         socket Server, AF_INET, SOCK_STREAM, getprotobyname 'tcp';
  45.                         setsockopt Server, SOL_SOCKET, SO_REUSEADDR, 1;
  46.                         my $paddr = sockaddr_in 8001, INADDR_ANY;
  47.                         bind Server, $paddr;
  48.                         listen Server, SOMAXCONN;
  49.                         while (accept my $Client , Server) {
  50.                                 select ((select($Client), $| = 1)[0]);
  51.                                 $rabbish->enqueue(threads->create(\&worker));
  52.                                 $fd->enqueue(fileno $Client);   # 这里把文件句柄转换成文件描述符
  53.                         }
  54.                 exit 1;
  55.         }

  56.         $lis->join;
  57.         $jt->join;
  58. }
复制代码
守护进程
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP