在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO。

1.非阻塞IO

可以将系统调用分为两类:低速系统调用和其他。低速系统调用是可能会使进程永远阻塞的一类系统调用。非阻塞IO可以使用不会永远阻塞的IO操作,如果这种操作不能完成,则立即出错返回,表示该操作如果继续执行,将继续阻塞下去。

对于一个给定的文件描述符,有两种方法对其指定非阻塞的IO:

(1)如果是调用open以获得该描述符,则可指定O_NONBLOCK标志
(2)对于已经打开的一个描述符,则可以调用fcntl打开O_NONBLOCK文件状态标志

下面的函数演示了如何打开一个描述符的文件状态标志以及如何关闭一个文件描述符的文件状态标志:

void set_fl(int fd,int flags)
{int val;if( (val=fcntl(fd,F_GETFL,0))<0 ){printf("fcntl F_GETFL error\n");exit(0);}val |= flags;if( (fcntl(fd,F_SETFL,val))<0 ){printf("fcntl F_SETFL error\n");exit(0);}
}void clr_fl(int fd,int flags)
{int val;if( (val=fcntl(fd,F_GETFL,0))<0 ){printf("fcntl F_GETFL error\n");exit(0);}val &= ~flags;if( (fcntl(fd,F_SETFL,val))<0 ){printf("fcntl F_SETFL error\n");exit(0);}
}

2.记录锁

记录在UNIX中是一个误用的概念,因为在UNIX中根本没有“文件记录”这种概念,记录锁的一种个准确的说法是区域锁。这个锁既可以锁一个字节,也可以锁住整个文件。我们使用fcntl函数来操作记录锁,fcntl的函数原型如下:

#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>int fcntl(int filedes,int cmd,.../*struct flock* flockptr*/);

第一个参数是文件描述符,第二个参数有三种选择如下:

(1)F_GETLK 决定由flockptr描述的锁是否被另外一把锁所排斥。如果有另外一把锁,它阻止创建由flockptr所描述的锁,则把这把锁写入到由flockptr所指向的结构体中。如果不存在这种情况,则除了把flockptr所指的结构体中的成员l_type设置为F_UNLCK之外,flockptr所指的结构体中的其他内容保持不变
(2)F_SETLK 设置由flockptr所指向的锁,如果设置失败,则立即出错返回
(3)F_SETLKW 这是F_SETLK的阻塞版本,如果不能建立锁,则会发生阻塞,W代表wait的意思

第三个参数是一个结构体,如下:

           struct flock {...short l_type;    /* Type of lock: F_RDLCK,F_WRLCK, F_UNLCK */short l_whence;  /* How to interpret l_start:SEEK_SET, SEEK_CUR, SEEK_END */off_t l_start;   /* Starting offset for lock */off_t l_len;     /* Number of bytes to lock */pid_t l_pid;     /* PID of process blocking our lock(F_GETLK only) */...};

l_type表示的是锁的类型,它有3种选择:

(1)F_RDLCK 表示这是一把读锁
(2)F_WRLCK 表示这是一把写锁
(3)F_UNLCK 解锁

l_whence和l_start共同决定了锁的起始位置,l_whence可以为SEEK_SET,SEEK_CUR,SEEK_END,l_start表示相对与l_whence的偏移量。l_len表示加锁区域的长度,如果l_len为0,则表示从指定位置一直加锁到文件结尾。l_pid表示加锁的进程pid。

关于加锁的过则如下:

                                    读锁                   写锁无锁               可以                   可以一把或多把读锁           可以                   拒绝一把写锁               拒绝                   拒绝

3.锁的隐含继承和释放

(1)当一个进程结束时,这个进程锁加的锁全部释放

(2)当一个描述符关闭时,则通过这个描述符锁建立的锁释放

(3)当关闭一个描述符时,则通过该描述符可以访问的到的任何一把锁都会被释放,这就是说,下面两种情况:

fd1 = open(pathname,...);
read_lock(fd1,...);
fd2 = dup(fd1);
close(fd2);

以及

fd1 = open(pathname,...);
read_lock(fd1,...);
fd2 = open(pathname,...);
close(fd2);

都会将由fd1所建立的锁释放。

(4)有fork产生的子进程并不继承父进程的锁建立的锁;

(5)在执行exec后,新程序可以继承原程序的锁

高级IO(一)--UNIX环境高级编程读书笔记相关推荐

  1. 标准IO库--unix环境高级编程读书笔记

    标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...

  2. 开发日记-20190827 关键词 读书笔记《Unix环境高级编程(第二版)》DAY 3

    Referred Blogs 文件描述符标志,文件状态标志 Linux中文件描述符fd和文件指针flip的理解 Linux编程–文件描述符fd 文件共享 Unix支持在不同进程间共享文件. 内核使用了 ...

  3. 开发日记-20190822 关键词 读书笔记《Unix环境高级编程(第二版)》《掌控习惯》DAY 2

    Preface 话说,昨天开始尝试着去改变自己,从基础的习惯开始,11:30准时睡觉,平时差不多12:30才睡觉.按理说,比平时早了一个小时睡觉吧,然后我就把闹钟提前了45分钟,想着还能比平常多睡15 ...

  4. 《Unix环境高级编程》---标准IO

    一.基础结构 1.文件 FILE FILE是标准IO用来表示文件的结构体,所有标准IO都以FILE为基础. stdin FILE类型的指针,指向标准输入流. stdout FILE类型的指针,指向标准 ...

  5. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

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

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

  7. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  8. 【UNIX环境高级编程】

    [UNIX环境高级编程] 环境搭建 1.下载源码 wget http://apuebook.com/src.3e.tar.gz 2.解压 tar -zxvf src.3e.tar.gz 3.安装lib ...

  9. Unix环境高级编程 笔记

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

最新文章

  1. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )
  2. 显示lib包_【手把手教你】股市技术分析利器之TA-Lib(一)
  3. Matplotlib Tutorial(译)
  4. 基于FTP的Nordic nRF51822 OTA 教程一之修改boot区大小
  5. I love exam HDU - 6968
  6. 大数据可视化大屏设计经验,教给你!
  7. 鸿蒙系统 塞班,华为鸿蒙系统来了:安卓系统会成为下一个“塞班”吗?
  8. keepalived track script introduce
  9. (四)、jave2加工视频
  10. c语言第九章课后作业答案,C语言课后习题部分答案
  11. 未来20年美国AI研究路线图
  12. Linux操作系统课后参考答案
  13. 华尔街追逐中国机遇,阿里巴巴收盘价创下历史新高
  14. 曲苑杂坛--即时文件初始化特性
  15. 揭秘慕思“智商税”:狂砸40亿搞营销,发明专利仅7项
  16. html css做一个简历表,HTML table制做我的简历
  17. List中remove()方法的陷阱,开发谨记!
  18. 数据库系统概论复习提纲
  19. java 重写equals的要点_重写equals 方法的注意事项
  20. Windows 10 C:/Users/用户名/AppData里面的文件选择性清空

热门文章

  1. C语言中动态数组的分配
  2. 【leetcode-101】 对称二叉树
  3. 当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
  4. 单点登录实现机制:web-sso
  5. [bzoj4763]雪辉[bzoj4812][Ynoi2017]由乃打扑克
  6. 第八章 linux磁盘与文件系统管理g
  7. 为什么道理都懂,课执行力差的现象如此普遍?
  8. 2013年3月洗衣机类品牌网络知名度排名
  9. Android编译过程详解(三)
  10. SQL Server数据库导入导出数据方式比较