2019独角兽企业重金招聘Python工程师标准>>>

1、非阻塞IO
系统调用分成“低速”系统调用和其他系统调用。低速系统调用是可能会使进程永远阻塞的一类系统调用
1)如果某些文件类型(管道、终端设备、网络设备)的数据不存在,则读操作可能会使调用者永远阻塞
2)如果数据不能立即被上述同样类型的文件接受,则写操作也会使调用者永远阻塞。
3)在某种条件发生之前,打开某些类型的文件会被阻塞
4)对已经加上强制性记录锁的文件进行读、写
5)某些进程间通信函数
非阻塞IO使我们可以调用open read write这样的IO操作,并使这些操作不会永远阻塞。
给定的描述符指定非阻塞IO
1)如果调用open获得描述符,则可指定O_NONBLOCK 标志
2)对于已经打开的描述符,可调用fcntl
2、IO多路转接
IO多路转接(IO multiplexing),先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行IO时,该
函数才返回。在返回时,它告诉进程哪些描述符已准备好可以进行IO
select 和 pselect
传向select的参数告诉内核:
1)select 函数使我们可以执行IO多路转接,传向select的参数告诉内核:
我们所关心的描述符
2)对于每个描述符我们所关心的状态(是否读一个给定的描述符?是否想写一个给定的描述符?是否关心一个描述符的异常状态)
3)愿意等待多长时间
select返回时,内核告诉我们:
1)已准备好的描述符的数量
2)对于读、写、异常这三个状态中的每一个,哪些描述符已经准备好。
/* According to POSIX.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
void FD_CLR(int fd, fd_set *set);
int  FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
#include <sys/select.h>
int pselect(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, const struct timespec *timeout,
const sigset_t *sigmask);
poll
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
#define _GNU_SOURCE
#include <poll.h>
int ppoll(struct pollfd *fds, nfds_t nfds,
const struct timespec *timeout, const sigset_t *sigmask);
3、readn和writen
管道、FIFO以及某些设备,特别是终端、网络和STREAMS设备有下列二种性质:
1)一次read操作所返回的数据可能少于所要求的数据,即使还没达到文件尾端也可能是这样。这不是一个错误,应该继续读该设备。
2)一次write操作的返回值也可能少于指定输出的字节数
通常当读、写一个管道、网络设备或终端时,我们需要考虑这些特性。
readn和writen的功能是读、写指定的N字节数据,并处理返回值小于要求值的情况。

ssize_t      /* Read "n" bytes from a descriptor. */
readn(int fd, void *vptr, size_t n)
{
 size_t nleft;
 ssize_t nread;
 char *ptr;

ptr = vptr;
 nleft = n;
 while (nleft > 0) {
  if ( (nread = read(fd, ptr, nleft)) < 0) {
   if (errno == EINTR)
    nread = 0;  /* and call read() again */
   else
    return(-1);
  } else if (nread == 0)
   break;    /* EOF */

nleft -= nread;
  ptr   += nread;
 }
 return(n - nleft);  /* return >= 0 */
}

ssize_t      /* Write "n" bytes to a descriptor. */
writen(int fd, const void *vptr, size_t n)
{
 size_t  nleft;
 ssize_t  nwritten;
 const char *ptr;

ptr = vptr;
 nleft = n;
 while (nleft > 0) {
  if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
   if (nwritten < 0 && errno == EINTR)
    nwritten = 0;  /* and call write() again */
   else
    return(-1);   /* error */
  }

nleft -= nwritten;
  ptr   += nwritten;
 }
 return(n);
}

转载于:https://my.oschina.net/zmalloc/blog/177564

Unix环境高级编程笔记:12、高级IO相关推荐

  1. NDK 高级编程(笔记)

    Android 开发中针对 NDK 的书籍很少,<Pro Android C++ with the NDK>也是出版的比较早的一本书,有些内容可能对现在的开发并不适用.但是书中介绍的内容比 ...

  2. Unix环境经典编程书籍推荐

    转自:http://blog.csdn.net/beachman/article/details/6600837 Unix环境经典编程书籍推荐 在Unix环境编程领域涉及的知识面比较宽,很多新人进来的 ...

  3. Go语言编程笔记12:web基础

    Go语言编程笔记12:web基础 图源:wallpapercave.com 开一个新坑,用Go来做web开发.虽然已经从事多年基于LAMP的web开发,但最近学习了Go编程,所以打算借着学习<G ...

  4. Unix环境高级编程 笔记

    Unix环境高级编程(第二版)学习笔记 这是一次较长时间的整理,然而跳跃了一些章节和很多知识点,仍然是很不完善很不全面的. 前言 操作系统某些问题 严格意义上,可将操作系统定义为一种软件,它控制计算机 ...

  5. UNIX环境高级编程笔记

    1.setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, len);   SO_REUSEADDR套接口选项允许为以下四个不同的目的提供服务:   ...

  6. UNIX环境高级编程笔记之文件I/O

    一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是"哇"这种很吃惊的表情.其实大概三年前,那会 ...

  7. UNIX环境高级编程笔记(2)- STDIN_FILENO、STDOUT_FILENO和stdin、stdout的区别

    目录 前言 一.STDIN_FILENO.STDOUT_FILENO介绍 二.stdin.stdout介绍 三.代码例程 1.文件描述符的使用 2.流的使用 3.代码标记 总结 前言 本章主要通过UN ...

  8. UINX环境高级编程笔记 第3章 文件I/O

    UNIX环境高级编程 第三章 文件I/O 3.1 引言 3.2 文件描述符 3.3 函数open和openat 3.4 函数creat 3.5 函数close 3.6 函数lseek 3.7 函数re ...

  9. Python 高级编程笔记之类别

    目录: 子类化内建类型 访问超类中的方法-super 描述符 & 属性 元编程 主要内容: 1.子类化内建类型 # -*- coding:utf-8 -*-class Folder(list) ...

  10. python高级编程函数_Python高级编程之十大装B语法

    for - else 什么?不是 if 和 else 才是原配吗?No,你可能不知道,else 是个脚踩两只船的家伙,for 和 else 也是一对,而且是合法的.十大装B语法,for-else 绝对 ...

最新文章

  1. 第一课.深度学习简介
  2. communication for making more gains or simply a leisure?
  3. int android.support.v7.widget.RecyclerView$ViewHolder.mItemViewType' on a null.....
  4. Handler、Message的简单使用
  5. 关于tornado的异步耗时操作假设
  6. 【OpenJ_Bailian - 2299 】Ultra-QuickSort (归并排序 或 离散化 + 树状数组)
  7. Bootstrap栅格系统研究
  8. MySQL懒查询_mysql 联查的基本命令
  9. Linux下SVN 命令操作手册
  10. 使用VSCode时,执行ng serve出错
  11. PE文件结构及其加载机制(四)
  12. [JVM] Java虚拟机栈
  13. 利用数据细分目标客户群
  14. JS严格模式(use strict)
  15. python项目总结与展望_2018年度总结,2019展望未来
  16. 数据库的三级封锁协议
  17. 这世上,真有人会陪你手握屠龙刀,杀得生活措手不及!
  18. winform抓取淘宝宝贝详细页的上下架时间等信息
  19. 网站搬家,服务器迁移注意事项有哪些?
  20. 如何设置maya的Render.exe程序来mayabatch批量渲染

热门文章

  1. 4t硬盘实际容量是多少_4TB超大容量+便携实用的移动硬盘-东芝A3移动硬盘体验
  2. java重新开始循环_java for循环只进行第一次循环
  3. 小顶堆时间复杂度_时间轮算法以及时间轮在Netty和Kafka中的应用的
  4. 第一个神经网络代码分享
  5. java火币网做接口_火币网API文档——Websocket 请求与订阅示例
  6. 机器学习项目完整案例:预测区域的房价中位数
  7. rs232转usb_#每日一练2.19#一起学习USB转串口通信
  8. Linux centos hook,centos7 U盘安装卡在 starting dracut initqueue hook
  9. java home centos_Centos7配置JAVA_HOME
  10. PHP以指定字段为索引返回数组数据