Perl 四论元选择题

Perl 四论元选择题,perl,select,filehandle,file-descriptor,Perl,Select,Filehandle,File Descriptor,从选择_TUT: 。。。用于有效监视多个文件描述符,以查看其中是否有任何文件描述符已准备就绪;也就是说,查看I/O是否成为可能,或者在任何描述符上是否发生了异常情况。 那么选择的意义是什么呢?我就不能在我想的时候读写我的描述吗?select的要点是,它同时监视多个描述符,如果没有活动,则正确地将进程置于睡眠状态。Unix程序员经常发现自己处于这样的境地:他们必须处理来自多个文件描述符的I/O,其中数据流可能是断断续续的。如果只创建一系列读2和写2调用,您会发现其中一个调用可能会阻止等待来自/到

从选择_TUT:

。。。用于有效监视多个文件描述符,以查看其中是否有任何文件描述符已准备就绪;也就是说,查看I/O是否成为可能,或者在任何描述符上是否发生了异常情况。

那么选择的意义是什么呢?我就不能在我想的时候读写我的描述吗?select的要点是,它同时监视多个描述符,如果没有活动,则正确地将进程置于睡眠状态。Unix程序员经常发现自己处于这样的境地:他们必须处理来自多个文件描述符的I/O,其中数据流可能是断断续续的。如果只创建一系列读2和写2调用,您会发现其中一个调用可能会阻止等待来自/到文件描述符的数据,而另一个文件描述符虽然已准备好进行I/O,但未使用。select可以有效地处理这种情况

有人能给我解释一下,这意味着什么,以及它是如何工作的,也许可以举个小例子

例如,这里只选择了一个文件句柄,为什么我需要监视

my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );

从文件句柄读取是一种阻塞操作。如果您试图从标准输入读取数据,但没有输入,则程序将等待输入。这种效果可以通过在没有输入的情况下运行诸如grep之类的过滤程序来说明:

$ grep foo
_
grep等待输入。如果您键入内容并按Ctl-d关闭STDIN grep's read将获取您的输入,检查匹配项,如果有匹配项,则打印匹配项并退出

现在假设您正在编写一个网络应用程序,如IRC客户机,在运行GUI主循环时必须从多个不同的连接读取数据。这就是select解决的问题


这里有一篇文章应该给你一个彻底的解释:

从文件句柄读取是一个阻塞操作。如果您试图从标准输入读取数据,但没有输入,则程序将等待输入。这种效果可以通过在没有输入的情况下运行诸如grep之类的过滤程序来说明:

$ grep foo
_
grep等待输入。如果您键入内容并按Ctl-d关闭STDIN grep's read将获取您的输入,检查匹配项,如果有匹配项,则打印匹配项并退出

现在假设您正在编写一个网络应用程序,如IRC客户机,在运行GUI主循环时必须从多个不同的连接读取数据。这就是select解决的问题

这里有一篇文章应该给你一个彻底的解释: