⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch07_15.htm

📁 By Tom Christiansen and Nathan Torkington ISBN 1-56592-243-3 First Edition, published August 1998
💻 HTM
字号:
<HTML><HEAD><TITLE>Recipe 7.14. Doing Non-Blocking I/O (Perl Cookbook)</TITLE><METANAME="DC.title"CONTENT="Perl Cookbook"><METANAME="DC.creator"CONTENT="Tom Christiansen &amp; Nathan Torkington"><METANAME="DC.publisher"CONTENT="O'Reilly &amp; Associates, Inc."><METANAME="DC.date"CONTENT="1999-07-02T01:37:18Z"><METANAME="DC.type"CONTENT="Text.Monograph"><METANAME="DC.format"CONTENT="text/html"SCHEME="MIME"><METANAME="DC.source"CONTENT="1-56592-243-3"SCHEME="ISBN"><METANAME="DC.language"CONTENT="en-US"><METANAME="generator"CONTENT="Jade 1.1/O'Reilly DocBook 3.0 to HTML 4.0"><LINKREV="made"HREF="mailto:online-books@oreilly.com"TITLE="Online Books Comments"><LINKREL="up"HREF="ch07_01.htm"TITLE="7. File Access"><LINKREL="prev"HREF="ch07_14.htm"TITLE="7.13. Reading from Many Filehandles Without Blocking"><LINKREL="next"HREF="ch07_16.htm"TITLE="7.15. Determining the Number of Bytes to Read"></HEAD><BODYBGCOLOR="#FFFFFF"><img alt="Book Home" border="0" src="gifs/smbanner.gif" usemap="#banner-map" /><map name="banner-map"><area shape="rect" coords="1,-2,616,66" href="index.htm" alt="Perl Cookbook"><area shape="rect" coords="629,-11,726,25" href="jobjects/fsearch.htm" alt="Search this book" /></map><div class="navbar"><p><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_14.htm"TITLE="7.13. Reading from Many Filehandles Without Blocking"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.13. Reading from Many Filehandles Without Blocking"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><B><FONTFACE="ARIEL,HELVETICA,HELV,SANSERIF"SIZE="-1"><ACLASS="chapter"REL="up"HREF="ch07_01.htm"TITLE="7. File Access"></A></FONT></B></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_16.htm"TITLE="7.15. Determining the Number of Bytes to Read"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.15. Determining the Number of Bytes to Read"BORDER="0"></A></TD></TR></TABLE></DIV><DIVCLASS="sect1"><H2CLASS="sect1"><ACLASS="title"NAME="ch07-17832">7.14. Doing Non-Blocking I/O</A></H2><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1410">Problem<ACLASS="indexterm"NAME="ch07-idx-1000009722-0"></A><ACLASS="indexterm"NAME="ch07-idx-1000009722-1"></A><ACLASS="indexterm"NAME="ch07-idx-1000009722-2"></A><ACLASS="indexterm"NAME="ch07-idx-1000009722-3"></A></A></H3><PCLASS="para">You want to read from or write to a filehandle without the system blocking your process until the program, file, socket, or device at the other end is ready. This is desired less often of regular files than of special files.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1416">Solution</A></H3><PCLASS="para">Open the file with <CODECLASS="literal">sysopen,</CODE> and specify the <CODECLASS="literal">O_NONBLOCK</CODE><ACLASS="indexterm"NAME="ch07-idx-1000009723-0"></A> option:</P><PRECLASS="programlisting">use Fcntl;sysopen(MODEM, &quot;/dev/cua0&quot;, O_NONBLOCK|O_RDWR)    or die &quot;Can't open modem: $!\n&quot;;</PRE><PCLASS="para">If you already have a filehandle, use <CODECLASS="literal">fcntl</CODE><ACLASS="indexterm"NAME="ch07-idx-1000009724-0"></A> to change the flags:</P><PRECLASS="programlisting">use Fcntl;$flags = '';fcntl(HANDLE, F_GETFL, $flags)    or die &quot;Couldn't get flags for HANDLE : $!\n&quot;;$flags |= O_NONBLOCK;fcntl(HANDLE, F_SETFL, $flags)    or die &quot;Couldn't set flags for HANDLE: $!\n&quot;;</PRE><PCLASS="para">Once a filehandle is set for non-blocking I/O, the <CODECLASS="literal">sysread</CODE> or <CODECLASS="literal">syswrite</CODE> calls that would block will instead return <CODECLASS="literal">undef</CODE> and set <CODECLASS="literal">$!</CODE> to EAGAIN:</P><PRECLASS="programlisting">use POSIX qw(:errno_h);$rv = syswrite(HANDLE, $buffer, length $buffer);if (!defined($rv) &amp;&amp; $! == EAGAIN) {    # would block} elsif ($rv != length $buffer) {    # incomplete write} else {    # successfully wrote}$rv = sysread(HANDLE, $buffer, $BUFSIZ);if (!defined($rv) &amp;&amp; $! == EAGAIN) {    # would block} else {    # successfully read $rv bytes from HANDLE}</PRE></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1484">Discussion</A></H3><PCLASS="para">The <CODECLASS="literal">O_NONBLOCK</CODE> constant is part of the POSIX standard, so most machines should support it. We use the POSIX module to get the numeric value for the error EAGAIN.</P></DIV><DIVCLASS="sect2"><H3CLASS="sect2"><ACLASS="title"NAME="ch07-pgfId-1490">See Also</A></H3><PCLASS="para">The <CODECLASS="literal">sysopen</CODE> and <CODECLASS="literal">fcntl</CODE> functions in <ICLASS="filename">perlfunc </I>(1) and in <ACLASS="olink"HREF="../prog/ch03_01.htm">Chapter 3</A> of <ACLASS="citetitle"HREF="../prog/index.htm"TITLE="Programming Perl"><CITECLASS="citetitle">Programming Perl</CITE></A>; the documentation for the standard POSIX module; your system's <ICLASS="filename">open </I>(2) and <ICLASS="filename">fcntl</I> (2) manpages; <ACLASS="xref"HREF="ch07_14.htm"TITLE="Reading from Many Filehandles Without Blocking">Recipe 7.13</A>; <ACLASS="xref"HREF="ch07_16.htm"TITLE="Determining the Number of Bytes to Read">Recipe 7.15</A></P></DIV></DIV><DIVCLASS="htmlnav"><P></P><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><TABLEWIDTH="684"BORDER="0"CELLSPACING="0"CELLPADDING="0"><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_14.htm"TITLE="7.13. Reading from Many Filehandles Without Blocking"><IMGSRC="../gifs/txtpreva.gif"ALT="Previous: 7.13. Reading from Many Filehandles Without Blocking"BORDER="0"></A></TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="book"HREF="index.htm"TITLE="Perl Cookbook"><IMGSRC="../gifs/txthome.gif"ALT="Perl Cookbook"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228"><ACLASS="sect1"HREF="ch07_16.htm"TITLE="7.15. Determining the Number of Bytes to Read"><IMGSRC="../gifs/txtnexta.gif"ALT="Next: 7.15. Determining the Number of Bytes to Read"BORDER="0"></A></TD></TR><TR><TDALIGN="LEFT"VALIGN="TOP"WIDTH="228">7.13. Reading from Many Filehandles Without Blocking</TD><TDALIGN="CENTER"VALIGN="TOP"WIDTH="228"><ACLASS="index"HREF="index/index.htm"TITLE="Book Index"><IMGSRC="../gifs/index.gif"ALT="Book Index"BORDER="0"></A></TD><TDALIGN="RIGHT"VALIGN="TOP"WIDTH="228">7.15. Determining the Number of Bytes to Read</TD></TR></TABLE><HRALIGN="LEFT"WIDTH="684"TITLE="footer"><FONTSIZE="-1"></DIV<!-- LIBRARY NAV BAR --> <img src="../gifs/smnavbar.gif" usemap="#library-map" border="0" alt="Library Navigation Links"><p> <a href="copyrght.htm">Copyright &copy; 2002</a> O'Reilly &amp; Associates. All rights reserved.</font> </p> <map name="library-map"> <area shape="rect" coords="1,0,85,94" href="../index.htm"><area shape="rect" coords="86,1,178,103" href="../lwp/index.htm"><area shape="rect" coords="180,0,265,103" href="../lperl/index.htm"><area shape="rect" coords="267,0,353,105" href="../perlnut/index.htm"><area shape="rect" coords="354,1,446,115" href="../prog/index.htm"><area shape="rect" coords="448,0,526,132" href="../tk/index.htm"><area shape="rect" coords="528,1,615,119" href="../cookbook/index.htm"><area shape="rect" coords="617,0,690,135" href="../pxml/index.htm"></map> </BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -