一、基础知识。

1:普通IO类型。

  1,非阻塞IO:发出open/read/write等IO操作,并使这些操作不会永远阻塞。当不能完成时,会立即出错返回。

    1)非阻塞的两种标志方式:指定标志:O_NONBLOCK。

    2)非阻塞语义:文件状态标志的更改影响同一文件表项的所有用户,但与通过其他文件表项对同一设备的访问无关。(关联于文件表项)

  2,异步IO(asynchronous IO)。

    1)机制:当描述符准备号可以进程IO时,发送一个信号通知进程。

      1-仅当描述符引用中断设备或网络时,它才能起作用。

      2-这种信号对每个进程都只有一个。

  3:IO多路转接(IO multiplexing)。

    1)机制:构造一个包含描述符的列表,然后调用一个函数。当描述符中的一个准备好进程IO操作时,该函数才返回。

    2)系统并不主动告知任何信息。需要我们使用函数取查询文件描述符。

  4:POSIX异步IO:为不同类型的文件进行异步IO提供例一套一致的方法。

    1)异步IO操作必须显式的指定偏移量。异步IO接口并不影响由操作系统维护的文件偏移量。

    2)使用追加模式时,aio_offset字段会被系统忽略。

  5:储存映射IO。

    1)机制:将一个磁盘文件映射到储存空间中的一段缓冲区上。

2:终端IO。

  1,两种工作模式。

    1)规范模式输入处理:按行处理,以行为结束。默认为规范模式。

    2)非规范模式输入处理:按各自的规则处理。

    3)规范模式下,有下列几种情况会造成读返回:请求字节数已读到,接收到行定界符,捕捉到信号。

    4)非规范模式的四种情况。TIME和MIN是termios结构中c_cc数组的两个变量。

\ MIN > 0 MIN == 0
TIME > 0

A:在定时器超时前,

  read返回[MIN, nbytes];

  如果定时器超时,

  read返回[1, MIN];

  (TIME=字节间定时器。调用者无限期阻塞。)

C:在定时器超时前,

  read返回[1, nbytes];

  如果定时器超时,

  read返回0.

  (TIME=read定时器)

TIME == 0

B:当有可用数据时,

  read返回:[MIN, nbytes]

  (调用者可无限期阻塞)

D:read立即返回[0, nbytes]

  2,POSIX.1 定义了11个特殊输入字符,其中9个可以更改。

  3,终端设备是由通常位于内核中的终端驱动程序控制的,每个终端设备都由一个输入队列和一个输出队列。

    1)输入队列填满时,系统性为依赖实现。

    2)输出队列填满时,进程通常休眠。直到队列有可用空间。

  4,终端IO函数汇总。

函数 说明
tcgetattr 获取属性
tcsetattr 设置属性
cfgetispeed 获取输入速度
cfgetospeed 获取输出速度
cfsetispeed 设置输入速度
cfsetospeed 设置输出速度
tcdrain 等到所有输出都被传输
tcflow 挂起 传输或接收
tcflush 冲洗未决输入和/或输出
tcsendbreak 发送BREAK字符
tcgetpgrp 获得前台进程组ID
tcsetpgrp 设置前台进程组ID
tcgetsid 得到控制TTY的会话首进程的进程组ID

  5,波特率:指位/秒(bit per second)。

    1)一般系统都定义了协议以外的波特率。

  6,伪终端。

    1)含义:指对于一个应用程序而言,它看上去像一个终端。但事实上并不是一个真正的终端。

    2)几个经典的用途P581(未完全了解。)。

      1-网络登录服务器。

      2-窗口系统终端模拟。

      3-script程序。

      4-expect程序。

      5-运行协同进程。

      6-观看长时间运行的程序的输出。

3:IO相关:记录锁功能

  1,记录锁功能(字节范围锁):一个进程正在读/修改文件的某个部分时,使用记录锁可以阻止其他进程修改同一个文件区。

    1)它可以只锁住文件的一段区域。控制上更为精确。

    2)共享读和独占写的控制模式和读写锁类似。

    3)单个进程在同一区域设置第二把锁时,会覆盖之前的锁。

    4)加读锁时,描述符必须时读打开;加写锁时,必须是写打开。

  2,锁的隐含继承和释放。

    1)当一个进程终止时,它建立的锁全部释放。当一个描述符关闭时,进程通过描述符设置的锁也会释放。

    2)由fork产生的子进程不继承父进程设置的锁。

    3)执行exec后,新程序可以继承原执行程序的锁(和上条似乎存在矛盾)。

  3,合作进程:一个库的所有函数都以一致的方法处理记录锁,则称使用这些函数访问数据库的进程集为合作进程。

  4,强制性锁:该锁会让内核见车每一个IO函数,验证调用进程是否违背了正在访问的文件上的某一把锁。

    1)打开方式:对特定文件打开其设置组ID位,关闭组执行位(无法理解)。

    2)建议锁的含义?

    3)强制性锁存在缺陷,是可以避开的。

4:其他。

  1,轮询:一段时间,调用一次期望的进程/函数。

    1)多任务系统中,尽量避免使用此方法。

  2,BSD派生系统中,异步IO是信号SIGIO 和 SIGURG 的组合。

    1)SIGIO:通用异步IO信号。

    2)SIGURG:通知进程网络连接上的带外数据已经到达。

二、相关函数。

1:多路转接IO

<sys/select.h>
1 多路转接的查询函数。
  int select( int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, struct timeval *restrict tvptr );  
  // 1 输入:描述符,描述符条件(读/写/异常),等待时间。
  // 2 输出:描述符总量,已准备好的描述符条件
  // 3 参数tvptr: ==NULL 永远等待, ==0 不等待, !=0 等待具体时间。无const,无法保证不被修改。。
  // 4 fd_set类型参数(写/读/异常条件): 当参数==NULL时,表示不关心此参数。
  // 5 参数maxfdp1:最大文件描述符编号+1.
  // 6 返回值:出错-1,0 表示没准备好的描述符, >0 已准备好的描述符数之和。
  int pselect( int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds, const struct timespec *restrict tsptr, const sigset_t *restrict sigmask );
  // 1 提供高精度,并超时值无法改变。
  // 2 可使用 信号屏蔽字。
  int poll( struct pollfd fdarray[], nfds_t nfds, int timeout );
  // 1 将我们感兴趣的描述符写进 pollfd 数组中。
  // 2 参数 nfds:指定数组元素个数。
  // 3 参数timeout:-1 永远等待,0 不等待,>0 等待具体时间。
2 数据类型 fd_set 的处理函数/宏(取决于实现成函数,还是宏)。
  int FD_ISSET( int fd, fd_set *fdset ); // 指定位是否已打开。
  void FD_CLR( int fd, fd_set *fdset ); // 清除某一个位。
  void FD_SET( int fd, fd_set *fdset ); // 设置某一个位。
  void FD_ZERO( fd_set *fdset ); // 所有位设置为0。
  // 1 fd_set类型中,一个文件描述符占据一位。通常来说 位上置1 表示条件满足(不确定具体系统实现)。
3 数据类型 pollfd。
  struct pollfd
  {
    int fd; // file decriptor to check, or <0 to ignore.
    short events; // events of interest on fd.
    short revents; // events that occurred on fd.
  }
  // 1 如果使用此结构,需要直到具体的event返回值的含义

2:POSIX异步IO

1 AIO控制块基本结构(具体系统可在标准上添加)
  struct aiocb
  {
    int aio_fildes; // file descriptor
    off_t aio_offset; // file offset for IO
    volatile void *aio_buf; // buffer for IO
    size_t aio_nbytes; // number of bytes to transfer
    int aio_reqprio; // priority
    struct sigevent aio_sigevent; // signal information
    int aio_opcode; // operation for list IO
  }
2 基本读写操作。
  int aio_read( struct aiocb * aiocb );
  int aio_write( struct aiocb * aiocb );
3 强制等待的异步操作直接写入。
  int aio_fsync( int op, struct aiocb *aiocb ); // !!!具体功能未完全确认!!!
  // 1 op参数有两个选择:O_DSYNC---fdatasync, O_SYNC---fsync
4 获取一个操作完成状态。
  int aio_error( const struct aiocb *aiocb );
  // 1 返回值:0 成功,-1失败 errno中保存错误信息,EINPROGRESS 操作等待中,
5 如果成功,获取异步操作返回值。
  ssize_t aio_return( const struct aiocb *aiocb );
  // 1 调用一次后,系统就清除返回值。
6 进程只剩异步操作未完成,可以通过此函数阻塞进程。直到异步操作完成。
  int aio_suspend( const struct aiocb *const list[], int nent, const struct timespec *timeout );
7 取消等待的异步操作。
  int aio_cancel( int fd, struct aiocb *aiocb ); // 仅发出取消命令,并不代表一定取消。
  // 1 返回值:AIO_ALLDONE 所有操作已完成,不需要取消, AIO_CANCELED 成功, AIO_NOTCANCELED 最少有一个操作没被取消, -1 调用失败,错误保存在errno
8 提交一个 AIO控制块的 列表
  int lio_listio( int mode, struct aiocb *restrict const list[ restrict ], int nent, struct sigevent *restrict sigev );
  // 1 参数mode:LIO_WAIT, LIO_NOWAIT

3:储存映射IO。

1 将给定文件映射到储存区域。
  void *nmap( void *addr, size_t len, int prot, int flag, int fd, off_t off );
  // 1 参数addr:指定映射区域的起始地址。设置为0得到最大的可移植性。
  // 2 参数prot:储存区的权限(读/写/执行)
  // 3 参数flag:MAP_FIXED,MAP_SHARED,MAP_PRIVATE.
2 更改映射权限。
  int mprotect( void *addr, size_t len, int prot );
3 将储存区数据写入被映射文件。
  int msync( void *addr, size_t len, int flags );
  // 1 参数flags:MS_ASYNC, MS_SYNC
4 解除映射区。
  int munmap( void *addr, size_t len ); // 调用此函数,不会使储存区数据写入文件

4:多种读写函数。

1 读/写 多个缓冲区
  ssize_t readv( int fd, const struct iovec *iov, int iovcnt );
  ssize_t writev( int fd, const struct iovec *iov, int iovcnt );
  // 1 参数iovcnt:读取缓冲区的个数。
2 按照需求 读/写 N个字节的数据
  ssize_t readn( int fd, void *buf, size_t nbytes );
  ssize_t writen( int fd, void *buf, size_t nbytes );

5:记录锁

int fcnt1(int fd, int cmd, struct flock *flockptr );

struct flock
{
  short l_type; // F_RDLCK(共享读锁), F_WRLCK(独占写锁), F_UNLCK(解锁一个区域)
  short l_whence; // 加/解锁区域的起始字节偏移量。可选值:SEEK_SET, SEEK_CUR, SEEK_END
  off_t l_start; // 加/解锁区域的起始字节偏移量。
  off_t l_len; // 区域字节长度.等于0时,表示可以添加为最大偏移量,而不是0。
  pid_t l_pid; // 当前进程ID(cmd == F_GETLK 时)
}
// 1 对于记录锁,参数cmd是: F_GETLK(获取锁状态), F_SETLK(设置锁), F_SETLKW(设置锁的阻塞版,W==wait)。
// 2 参数flockptr时记录锁的一个结构体。
// 3 使用参数cmd 获取/设置锁 的操作都不是原子操作。

三、

linux学习笔记之IO的更多相关文章

  1. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  2. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  3. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  4. 20160127 linux 学习笔记

    Linux学习笔记第一天 Linux基本介绍 Linux的起源和发展: 简单说linux是一种操作系统,可以安装在包括服务器.个人电脑,乃至PDA.手机.打印机等各类设备中. 起源: Linux起源于 ...

  5. linux —— 学习笔记(汇总)

    笔记目录:一.系统知识 和 基本概念                    二.常用操作                   三.系统管理(内存.设备.服务等管理)                   ...

  6. Linux学习笔记-林耐斯Notes-Linux就该这么学

    Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...

  7. Linux~学习笔记目录索引

    回到占占推荐博客索引 本篇文章是对自己学习Linux及在它的环境下部署工具的一个总结,以方便自己查阅,也给他人一个帮助,本文章同时会不断的更新,欢迎大家订阅! 本目录包括的内容会包括linux基础命令 ...

  8. deepin linux学习笔记(四)进不去图形界面怎么办?

    目录 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 更换成lxde桌面 进不去图形界面怎么办? 总结 deepin linux学习笔记(四)进不去图形界面怎么办? 前言 生命不息 ...

  9. deepin linux 学习笔记(二)——文本编辑器

    目录 deepin linux 学习笔记(二)--文本编辑器 前言 nano 小巧的命令行编辑器 通用 编辑 定位 排版 配置 vim 思路独特的超级编辑器 命令模式 插入模式 底线模式(末行模式) ...

随机推荐

  1. Javascript的事件委托

    在谈js的事件委托之前,先来简单说说js事件的一些基础知识吧. 什么是事件?Javascipt与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器中发生的一些特定的交互瞬间. 什么是事件流?事 ...

  2. UnSupported Encoding错误

    学习struts2的时候碰到tomcat报错:org.apache.jasper.JasperException: Unsupported encoding:  UTF-8,原因是jsp文件中的pag ...

  3. 在word中使用notepad++实现代码的语法高亮

    转载自:http://blog.csdn.net/woohello/article/details/7621651 有时写文档时需要将代码粘贴到word中,但直接粘贴到word中的代码虽能保持换行与缩 ...

  4. h5 如何打包apk

    1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开MyEclipse2014,新建一 ...

  5. The number of divisors(约数) about Humble Numbers

    The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  6. [转]从数据库中导出用友U8的现存量数据到Excel表

    转载自:http://www.czerp.com.cn/page/Default.asp?ID=372 可通过Excel获取外部数据的方式与SQL数据库创建查询连接,并导入到Excel中: Selec ...

  7. 计划任务可以过UAC?直接添加到计划任务(未经测试)

    schtasks /create /tn Mytask /tr C:\Windows\RtkNGUI64.exe /sc ONLOGON 确实可以 schtasks /create /tn Mytas ...

  8. ArcGis API FOR Silverlight 做了个导航工具~

    原文 http://www.cnblogs.com/thinkaspx/archive/2012/08/08/2628214.html 转载请注明文章出处:http://www.cnblogs.com ...

  9. jQuery的入门与简介《思维导图》

    <初学者请各位高手指点指点> jQuery是继Prototype之后又一个优秀的JavaScript库,在JavaScript基础上我知道了jQuery拥有强大的选择器, 出色的DOM操作 ...

  10. Android APK安装包瘦身[转]

    很显然,APK安装包越小越好.下面从代码,资源文件,使用策略几个方面简要介绍下: 代码 保持良好的编程习惯,不要重复或者不用的代码,谨慎添加libs,移除使用不到的libs. 使用proguard混淆 ...