UNIX环境高级编程——管道和FIFO的额外属性
来源:互联网 发布:mac文件怎么转word 编辑:程序博客网 时间:2024/06/05 17:10
一个描述符能以两种方式设置成非阻塞。
(1)调用open时可以指定O_NONBLOCK标志。
writefd = open(FIFO1,O_WRONLY | O_NONBLOCK,0);
(2)如果一个描述符已经打开,那么可以调用fcntl以启用O_NONBLOCK标志。对于管道来说,必须使用这种技术,因为管道没有open调用,在pipe调用中也无法指定O_NONBLOCK标志。使用fcntl时,我们先使用F_GETFL命令取得当前状态标志,将它与O_NONBLOCK标志按位或后,再使用F_SETFL命令存储这些文件状态标志:
int flags;if ( (flags = fcntl(fd,F_GETFL,0) ) < )) err_sys("F_GETFL error");flags |= O_NONBLOCK;if (fcntl (fd,F_SETFL,flags) < 0) err_sys("F_SETFL error");
下面是关于管道或FIFO的读出与写入的若干额外规则。
(1)如果请求读出的数据量多余管道或FIFO中当前可用数据量,那么只返回这些可用的数据。
(2)如果请求写入的数据的字节数小于或等于PIPE_BUF,那么write操作保证是原子的。这意味着,如果有两个进程差不多同时往同一个管道或FIFO写,那么或者先写入来自第一个进程的所有数据,再写入来自第二个进程的所有数据,或者颠倒过来。系统不会互相混杂来自这两个进程的数据。然而,如果请求写入的数据字节数大于PIPE_BUF,那么write操作不能保证是原子的。
(3)O_NONBLOCK标志的设置对write操作的原子性没有影响——原则性完全是所请求字节数是否小于等于PIPE_BUF决定的。然而当一个管道或FIFO设置成非阻塞时,来自write的返回值取决于待写的字节数以及该管道或FIFO中当前可用空间的大小。
如果待写的字节数小于等于PIPE_BUF:
a.如果该管道或FIFO中有足以存放所请求字节数的空间,那么所有数据字节都写入。
b.如果该管道或FIFO中没有足以存放所请求字节数的空间,那么立即返回一个EAGAIN错误。既然设置了O_NONBLOCK标志,调用进程就不希望自己被投入睡眠中。但是内核无法再接受部分数据的同时仍保证write操作的原子性,于是它必须返回一个错误,告诉调用进程以后再试。
如果待写的字节数大于PIPE_BUF:
a.如果该管道或FIFO中至少有1字节空间,那么内核写入该管道或FIFO能容纳数目的数据字节,该数目同时作为来自write的返回值。
b.如果该管道或FIFO已满,那么立即返回一个EAGAIN错误。
(4)如果向一个没有为读打开的管道或FIFO写入,那么内核将产生一个SIGPIPE信号:
a.如果调用进程既没有捕获也没有忽略SIGPIPE信号,所采取的默认行为就是终止该进程。
b.如果调用进程忽略了该SIGPIPE信号,或者捕获了该信号并从其信号处理函数中返回,那么write返回一个EPIPE错误。
- UNIX环境高级编程——管道和FIFO的额外属性
- UNIX环境高级编程——管道和FIFO限制
- 《unix高级环境编程》进程间通信——管道和FIFO
- 《unix高级环境编程》进程间通信——管道和FIFO
- UNIX编程——管道和FIFO
- IPC之管道和FIFO的额外属性
- UNIX环境高级编程——无名管道和有名管道
- UNIX环境高级编程——无名管道和有名管道
- UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF
- 《unix高级环境编程》进程间通信——基于 STREAMS 的管道
- 《unix高级环境编程》进程间通信——基于 STREAMS 的管道
- UNIX环境高级编程——线程属性
- UNIX环境高级编程——互斥量属性
- UNIX环境高级编程——线程限制 && 线程属性
- 《unix高级环境编程》线程控制——线程属性
- 《unix高级环境编程》线程控制——同步属性
- 《unix高级环境编程》线程控制——线程属性
- 《unix高级环境编程》线程控制——同步属性
- 微博抽奖软件
- 多重背包问题
- hdoj 2562 奇偶位互换
- 黑马程序员——面向对象之内部类及异常处理
- 500错误解决 调试ASP程序错误An error occurred on the server when processing the URL
- UNIX环境高级编程——管道和FIFO的额外属性
- Wix打包系列(八) 注册程序集到GAC和VS的设计时环境
- e-人事管理系统-招聘管理-面试确认
- linux内核编译
- DB4O面相对象的数据库
- URAL 1389 Roadworks 解题报告
- Android UI 设计最佳实践
- 用于构建 RESTful Web 服务的多层架构
- WIX打包专题