一个描述符能以两种方式设置成非阻塞。

(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的额外属性的更多相关文章

  1. UNIX环境高级编程——管道和FIFO限制

    系统加于管道和FIFO的唯一限制为: OPEN_MAX     一个进程在任意时刻打开的最大描述符数: PIPE_BUF       可原子的写往一个管道或FIFO的最大数据量. OPEN_MAX的值 ...

  2. UNIX环境高级编程——管道读写规则和pipe Capacity、PIPE_BUF

    一.当没有数据可读时O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有数据来到为止. O_NONBLOCK enable:read调用返回-1,errno值为EAGAI ...

  3. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (十二) 一起学 Unix 环境高级编程 (APUE) 之 进程间通信(IPC)

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. 【UNIX环境高级编程】文件I/O

    [UNIX环境高级编程]文件I/O大多数文件I/O只需要5个函数: open.read.write.lseek以及close 不带缓冲的I/O: 每个read和write都调用内核中的一个系统调用 1 ...

  6. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  7. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  9. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. 利用Runtime实现简单的字典转模型

    前言 我们都知道,开发中会有这么一个过程,就是将服务器返回的数据转换成我们自己定义的模型对象.当然服务器返回的数据结构有xml类型的,也有json类型的.本文只讨论json格式的. 大家在项目中一般是 ...

  2. 90. Subsets II(中等,编写代码有难度)

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  3. CSS相关

    ===CSS框架=== https://github.com/lucasgruwez/waffle-grid 一个易于使用的 flexbox 栅格布局系统 ===CSS初始化=== https://g ...

  4. 如何搭建apache服务?

    为了日后便于查询,本文所涉及到的所有命令集合如下: chkconfig iptables off #关闭防火墙命令 在Centos7中使用的是chkconfig firewalld off vi /e ...

  5. C++笔记010:C++对C的扩展——register关键字增强

    register关键字:请求编译器让变量直接放到CPU内部寄存器里面,而不是通过内存寻址访问,速度快. 在C语言中,register修饰的变量不能取地址,去寄存器变量的地址在C语言里面是会出错的. i ...

  6. Docker如何获取镜像

    可以使用 docker pull 命令来从仓库获取所需要的镜像. 下面的例子将从 Docker Hub 仓库下载一个 Ubuntu 12.04 操作系统的镜像. $ sudo docker pull ...

  7. leetcode 之 Single Number II

    问题来源:Single Number II 问题描述:给定一个整数数组,除了一个整数出现一次之外,其余的每一个整数均出现三次,请找出这个出现一次的整数. 大家可能很熟悉另一个题目(Single Num ...

  8. DragVideo,一种在播放视频时,可以任意拖拽的方案

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53638896 前言 项目已开源到 ...

  9. Core Python Programming一书中关于深浅拷贝的错误

    该书关于深浅拷贝的论述: 6.20. *Copying Python Objects and Shallow and Deep Copies "when shallow copies are ...

  10. [tornado]使用webscoket的使用总是403错误

    使用的tornado版本为4.0+ 后台: PS D:\CodeHouse\tornado\websocket> python .\ws_app.py WARNING:tornado.acces ...