当前位置:  技术问答>linux和unix

阻塞和非阻塞打开命名管道有什么区别吗?

    来源: 互联网  发布时间:2017-01-06

    本文导语:  rt |  When attempting to read from an empty pipe or FIFO:         * If no process has the pipe open for writing, read() shall return 0 to indicate end-of-file.         * If some process has the pipe op...

rt

|
 When attempting to read from an empty pipe or FIFO:

        * If no process has the pipe open for writing, read() shall return 0 to indicate end-of-file.

        * If some process has the pipe open for writing and O_NONBLOCK is set, read() shall return -1 and set errno to [EAGAIN].

        * If some process has the pipe open for writing and O_NONBLOCK is clear, read() shall block the calling thread until some data is
          written or the pipe is closed by all processes that had the pipe open for writing.







 When attempting to read from an empty pipe or FIFO:

        * If no process has the pipe open for writing, read() shall return 0 to indicate end-of-file.

        * If some process has the pipe open for writing and O_NONBLOCK is set, read() shall return -1 and set errno to [EAGAIN].

        * If some process has the pipe open for writing and O_NONBLOCK is clear, read() shall block the calling thread until some data is
          written or the pipe is closed by all processes that had the pipe open for writing.

|
       Write requests to a pipe or FIFO shall be handled in the same way as a regular file with the following exceptions:

        * There is no file offset associated with a pipe, hence each write request shall append to the end of the pipe.

        * Write  requests  of  {PIPE_BUF}  bytes or less shall not be interleaved with data from other processes doing writes on the same
          pipe. Writes of greater than {PIPE_BUF} bytes may have data interleaved, on arbitrary boundaries, with  writes  by  other  pro‐
          cesses, whether or not the O_NONBLOCK flag of the file status flags is set.

        * If the O_NONBLOCK flag is clear, a write request may cause the thread to block, but on normal completion it shall return nbyte.

        * If the O_NONBLOCK flag is set, write() requests shall be handled differently, in the following ways:

           * The write() function shall not block the thread.

           * A write request for {PIPE_BUF} or fewer bytes shall have the following effect: if there is sufficient space available in the
             pipe, write() shall transfer all the data and return the number of bytes requested. Otherwise,  write()  shall  transfer  no
             data and return -1 with errno set to [EAGAIN].

           * A write request for more than {PIPE_BUF} bytes shall cause one of the following:

              * When  at least one byte can be written, transfer what it can and return the number of bytes written. When all data previ‐
                ously written to the pipe is read, it shall transfer at least {PIPE_BUF} bytes.

              * When no data can be written, transfer no data, and return -1 with errno set to [EAGAIN].


上面贴重了,这个是写.

|
O_RDONLY, O_WEONLY, O_NONBLOCK四种组合,阻塞情况比较简单,非阻塞稍有不同,自己查下资料吧

|
阻塞:在读写数据的时候如果不能读或写的时候程序将一直等待在这里,直到读或些被执行或者设置的超时时间到达才会返回。
非阻塞:如果不能立即读写程序立即返回。

|
管道和FIFO的阻塞与非阻塞说明直接参考man open即可,很详细。

因为管道和FIFO和其他IPC可能有点区别,因为只要一次性写字节数小于PIPE_SIZE属于原子写,如果容量不足那么将会阻塞,如果大于PIPE_SIZE那么不属于原子写,有多少容量写多少,如果一点都写不了应该是阻塞住的。

上边是阻塞情况,非阻塞情况下,原子写如果容量不足直接返回错误,并EAGAIN。 非原子写有多少容量写多少,如果一点都写不了返回-1并且EAGAIN。

读方面的话,都是有多少返回多少,如果一点都没有,阻塞的就阻塞,非阻塞的就返回错误EAGAIN。

像我们编程,无论哪一种IPC,我们只要遵从一个原则永远也不会出错,就是非阻塞描述符,检查返回值和错误即可,因为非阻塞描述符:
1.返回>0,说明写/读了多少字节,你就可以知道有多少没写/读成功。 
2,返回 File    # 写字符串到"File".
   exec 3 File             # 打开"File"并且给它分配fd 3.
   read -n 4 &3             # 写一个小数点.
   exec 3>&-                 # 关闭fd 3.
   cat File                  # ==> 1234.67890

|
楼上在说shell。。我们在说unix c

|


写和读是独立的,而且管道是FIRST IN FIRST OUT, 只要保证只有一个写端,一个读端,那么谁阻塞谁不阻塞没什么问题. 如果是多个写端,那得看数据写入量是否小于PIPE_SIZE,小于是原子写,大于的话多个写端需要同步.自己不懂多man一下,看不懂英语是不行的.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • select如何实现发送的阻塞和解除阻塞?
  • Linux下read函数默认到底是阻塞的还是非阻塞的?
  • 如何从阻塞式的read中取得阻塞了多少时间?
  • Select() 是否只能在非阻塞IO里使用,在阻塞IO里可以使用吗?
  • 请教sleep和pthread_delay_np:阻塞线程/阻塞进程?
  • recvfrom函数,已经设置好非阻塞模式,是否还存在阻塞的风险?
  • 怎么解除recvfrom阻塞的阻塞状态
  • linux 如何用SOCKET设置函数设置阻塞和非阻塞?
  • 非阻塞SOCKET,竟然也会阻塞?
  • 请教:线程中调用一个阻塞的方法后,进程及其它线程会阻塞么?
  • linux C socke编程 创建的socket默认是阻塞的还是非阻塞的?
  • 什么是非阻塞啊?我用下面的程序设计的,用非阻塞和不用都一样啊?
  • 初级问题,socket(AF_INET, SOCK_STREAM, 0)是阻塞式还是非阻塞式?
  • 请问:我发现在linux上的网络编程时, 若客户端连不上服务端,就会阻塞,但如果是在UNIX上,若连不上,会马上返回,并不阻 塞,怎样让它也能阻塞啊?
  • 关于《Unix网络编程》在ubuntu 8.04下运行的问题,服务器端阻塞在accept调用,客户端阻塞在connect调用,导致连接失败
  • 关于socket编程中阻塞的问题
  • linux fwrite 阻塞问题
  • 关于非阻塞I/O
  • 如何判断一个线程是否处于阻塞状态
  • 关于fread是否会阻塞的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3