URN Logo
UNIX Resources » Linux » China Linux Forum » Perl 编 程 » 10 » [FAQ] 5.1: 我该如何清洗(flush/unbuffer)输出文件句柄(an output
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
[FAQ] 5.1: 我该如何清洗(flush/unbuffer)输出文件句柄(an output
Author: DanceDanceDance    Posted: 2003-01-23 12:59    Length: 1,859 byte(s)
[Original] [Print] [Top]
5.1: 我该如何清洗(flush/unbuffer)输出文件句柄(an output filehandle)?为什么我必需这么做?
虽然Perl支持"command buffering",在这种方式中,每次输出命令之后,物理写(a physical write)被执行,但是实际上,Perl并不支持真正的被清洗的输出(unbuffered output)(除了你"syswrite(OUT, $char, 1)")。

标准的C I/O库(stdio)是将字符送到设备进行缓冲(buffer),这样,对于每一种类型来说,并没有系统调用。在大多数stdio执行中,输出缓冲的类型及其大小都是依设备类型而定。Perl的print()和write()函数要对输出进行缓冲,而syswrite()对缓冲一起进行分流(bypass)。

如果你想让你的输出在你执行print()或者write()之后立即被传送(而不被缓冲),你必需设定句柄的autoflush 标记(flag)。这个标记是Perl变量 $|,当它被设为真(true)的时候,Perl在每次print()或者write()后,将清洗句柄缓冲。设定$|仅仅影响目前被选定的默认的文件句柄的缓冲。你可以用一个参数的select()调用来选择这个句柄。(参阅perlfunc manpage的perlvar/$和select条目(entry))

用select()来选择想要的句柄,然后设定per-filehandle变量。
$old_fh=select(OUTPUT_HANDLE);
$|=1;
select($old_fh);

某些习惯用语(idioms)能够一次完成以上操作:
select((select(OUTPUT_HANDLE), $|=1)[0]);
$1=1, select $_ for select OUTPUT_HANDLE;

一些模块能够对句柄及其变量提供面对对象的途径 (access),如果你仅仅想用他们来做这点事情,那简直是杀鸡用牛刀。你可以使用IO::Handle:
use IO::Handle;
open(DEV, ">/dev/printer"); #but is this?
DEV->autofulush(1);

或者 IO::Socket:
use IO::Socket; #this one is kinda a pipe?
my $sock=IO::Socket::INET->new('www.example.com:80');
$sock->autoflush();
----
It's better to burn out than to fade away...
[Original] [Print] [Top]
« Previous thread
请教 #!/usr/bin/perl -wT
Perl 编 程
10
Next thread »
[FAQ] 7.4 如何跳过一些返回值?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:09:18, cost 0.062829971313477 ms.