在线程之间转发/传递文件描述符

托马斯·安德森

我有一个任务在等待一个线程中的连接并将其转发到另一个线程。也许我有些误解,但为什么我不能在主线程中重新打开文件描述符?

非常简化的代码:

sub inthread {
    $socket = new IO::Socket::INET ( ... );
    # ...
    while ( my $client = $socket->accept() ) {
       #if i print STDOUT, (fileno $client); # there i'll get 4
       push ( @shared, fileno $client);
    }
}


sub mainthread {
   if ( scalar @shared ) {
      $fd = shift @shared;
      # if i print (fileno $fd); # there i'll get 4
      open my $f, "<&=$fd" or die " error $!"; ### error here: Can't open 4: Bad file descriptor
      while ( <$f> ) { ... }
   }
}

threads->create(\&inthread);
while(1) { mainthread; }

完整的代码在那里http://dpaste.com/3381RKV

测试:

perl -w ./testcode.pl --port = 10102&
wget -O-http://127.0.0.1:10102/
池上

my $client创建一个范围为循环主体的变量。在传递的最后,放弃了对所包含句柄的最后一个引用,从而释放了文件句柄,从而关闭了关联的文件描述符。[1]

这是在另一个线程到达之前发生的open <&=,因此当您尝试为其创建新的文件句柄时,文件描述符不再有效。

独立演示:

#!/usr/bin/perl

use strict;
use warnings;

my $fd;

{
   open(my $fh, '<', $0)
      or die($!);

   $fd = fileno($fh);
}                               # File handle closed here.

{
   open(my $fh, '<&=', $fd)
      or die($!);               # Bad file descriptor
}

您必须确保不会过早关闭文件句柄。您可以将它们存储在以fd键控的数组或哈希中,另一个线程可以通过另一个共享结构让父线程知道不再需要它的处理程序。


  1. 在注释中链接的代码(而不是发布的代码)中,当您调用时,文件描述符被关闭close $client;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在线程之间转发/传递文件描述符

来自分类Dev

“在进程之间传递文件描述符”如何工作?

来自分类Dev

如何在进程之间将文件描述符传递给Ashmem

来自分类Dev

文件描述符在线程中重复

来自分类Dev

使用共享内存在两个进程之间传递套接字描述符

来自分类Dev

使用共享内存在两个进程之间传递套接字描述符

来自分类Dev

在线程之间传递对象

来自分类Dev

C ++-在线程之间传递数据

来自分类Dev

在线程之间传递对象

来自分类Dev

在线程之间传递NSManagedObjectContext

来自分类Dev

套接字文件描述符在不同进程之间是相同的

来自分类Dev

为什么在分叉的进程之间共享文件描述符?

来自分类Dev

多线程问题-在线程之间传递对象

来自分类Dev

不确定如何在线程之间传递对象

来自分类Dev

在线程之间传递可变数据

来自分类Dev

如何在线程之间传递数据?

来自分类Dev

如何在线程之间传递IUIAutomationElement

来自分类Dev

文件描述符和套接字文件描述符之间的区别

来自分类Dev

在线程之间共享资源(文件,互斥体)

来自分类Dev

重载epoll线程的文件描述符是否安全?

来自分类Dev

在C中通过引用返回并传递文件描述符

来自分类Dev

文件描述符位置

来自分类Dev

文件描述符0

来自分类Dev

文件描述符重复

来自分类Dev

读取文件描述符

来自分类Dev

关闭文件描述符

来自分类Dev

exec的文件描述符

来自分类Dev

泄漏文件描述符

来自分类Dev

读取文件描述符