Linux系统编程读书笔记
文件I/O模型
Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处。系统调用不会分配缓冲区用以返回信息给调用者。所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用。
1、open
open以前没有创建功能,后来通过参数可以设置创建文件。一个进程对能够打开的文件描述符的个数有限制的。
open的时候如果指定O_SYNC标志,则会使所有后续输出同步。即调用write会自动都将文件数据和元数据刷新到磁盘。现代的磁盘驱动器均内置大型高速缓存,而默认情况下使用O_SYNC只是将数据传递到该缓存中。如果禁用磁盘上的高速缓存,那么O_SYNC标志堆IO性能影响挺大的。尽量不用O_SYNC。
2、read
read对于普通文件,一般都是用一个循环,一次读请求的字节数,只有读到普通文件末尾返回0,读取的字节数可能小于请求的;但是对于管道,FIFO,socket和终端,在不同环境下也会出现read调用读取的字节数小于请求字节数。默认情况下,从终端读取字符,一遇到换行符,read调用就会结束。
另外,read调用没有在末尾给你添加上一个‘\0’,所以需要显示添加。
3、write
write调用成功,将返回实际写入的文件字节数。
4、close显示
显示关闭不再需要的文件描述符是一个好的编程习惯。
文件I/O缓冲
出于速度和效率的考虑,系统调用I/O和标准C语言库I/O函数在操作磁盘文件的时候会对数据进行缓冲。
缓存cache是为了加快读,缓冲buffer是为了缓冲写。
1、用户缓冲区大小对read和write系统调用I/O性能的影响
前文说的read和write系统调用,这里在说一下。write只是将用户空间缓冲区中的内容复制到内核高速缓存中,做完这些write调用就结束了。在后续某个时刻,内核会将其高速缓存的数据写入(刷新至)磁盘。因此,可以说系统调用和磁盘操作并不同步。如果还没有刷新到磁盘的时候,有进程需要读取这个文件的这几个字节,那么内核会自动从高速缓存提供这些数据,而不是从文件。与此同理,read系统调用只是将内核高速缓存的数据复制到用户空间的缓冲区,内核高速缓存数据被取完之后,内核会将文件的下一段内容读取到内核高速缓存中。采用这中设计,一是read和write系统调用的操作更为迅速,二是减少了内核必须执行的磁盘传输操作。
内存高速缓冲区在Linux中设计为页面大小,所以,当用户空间缓冲区的大小大于等于页面大小的时候效率比较高。Linux内核尽可能多的分配高速缓存页。当内存空间紧张的时候,会对一些修改过的缓存页进行刷新并释放空间。
2、stdio库的缓冲
C语言函数库的I/O函数(比如 fprintf()/fscanf() fputs()/fgets() fputc()/fgetc())缓冲大块数据减少系统调用。
我们可以调用setvbuf来设置stdio的缓冲模式。
(1)_IONBF 不对I/O进行缓冲 对每个库函数立即调用读写系统调用
(2)_IOLBF 采用行缓冲I/O 只要有一行或者满了执行读写系统调用
(3)_IOFBF 采用全缓冲I/O 缓冲区满了才执行读写系统调用
设置不同的模式,read和write的调用时机是不一样的。不缓冲——调用库函数往缓冲区里放入数据,放入后立马write到内核的高速缓存区。行缓冲——调用库函数往缓冲区中放入数据,只要数据中含有换行符或者缓冲区满了,就会write到内核的高速缓存区。全缓冲——调用库函数往缓冲区中放入数据,只有满了的时候才会调用write系统调用将数据写入内核高速缓存区。读的时候同理。
3、I/O缓冲小结
I/O系统调用其实就是将缓冲区的内容与内核高速缓存区进行复制,没有缓冲模式。但是stdio库函数会根据缓冲模式进行复制。

Linux系统编程读书笔记的更多相关文章
- tcpdump dns包(linux高性能编程读书笔记2)
tcpdump -i eth0 -nt -s 500 port domain host -t A www.baidu.com www.baidu.com is an alias for www.a ...
- 读书笔记之Linux系统编程与深入理解Linux内核
前言 本人再看深入理解Linux内核的时候发现比较难懂,看了Linux系统编程一说后,觉得Linux系统编程还是简单易懂些,并且两本书都是讲Linux比较底层的东西,只不过侧重点不同,本文就以Linu ...
- C++Windows核心编程读书笔记
转自:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%96%87/71405.shtml "C++Windows核心编程读书笔 ...
- Linux系统编程博客参考
通过看前人的博客更易于把握知识要点 http://www.cnblogs.com/mickole/category/496206.html <Linux系统编程> http://www.c ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- Linux系统编程温故知新系列 --- 01
1.大端法与小端法 大端法:按照从最高有效字节到最低有效字节的顺序存储,称为大端法 小端法:按照从最低有效字节到最高有效字节的顺序存储,称为小端法 网际协议使用大端字节序来传送TCP分节中的多字节整数 ...
- linux系统编程之错误处理
在linux系统编程中,当系统调用出现错误时,有一个整型变量会被设置,这个整型变量就是errno,这个变量的定义在/usr/include/errno.h文件中 #ifndef _ERRNO_H /* ...
- LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题
19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程 ...
- Node.js高级编程读书笔记Outline
Motivation 世俗一把,看看前端的JavaScript究竟能做什么. 顺便检验一下自己的学习能力. Audience 想看偏后台的Java程序员关于前端JavaScript的认识的职业前端工程 ...
随机推荐
- Windows Text Copyer 1.1绿色版
软件名称: Windows Text Copyer软件语言: 简体中文授权方式: 免费软件运行环境: Win 32位/64位软件大小: 269KB图片预览: 软件简介:有些网站限制复制,你可以用这个软 ...
- js控制日期选择框datetime-local和select的展开
注: js控制元素展开不受元素css属性的限制,例如opacity,z-index等 1. 使用js控制日期选择框的展开 ios: document.querySelector(".targ ...
- php 关了浏览器也可以自动运行脚本
<?php ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(0); //执行时间为无限制,php默认 ...
- MAC图片格式转换
OS X下有一个sips的程序可以用来处理图片. sips的名称功能非常强大,参考 帮助文档 . 这里我们只用到其中的一个功能,转换图片格式. 命令参考: sips - s format jpeg ...
- 五种JSP页面跳转方法详解
1. RequestDispatcher.forward() 是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个 ...
- wmts调用路径手工合成
wmts调用路径手工合成 一般OGC WMTS地图只提供了xml描述,地图应用常常要合成WMTS完整的调用URL.我们需要获知以下参数: BaseURL:例如 "http://10.36.5 ...
- MYSQL超时连接问题(com.mysql.jdbc.MysqlIO.readFully)
应用服务器连接mysql,有时候会出现以下异常: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.jav ...
- linux中的 tar命令的 -C 参数,以及其它一些参数(转)
linux中的 tar命令的 -C 参数,以及其它一些参数 复制源:http://www.cnblogs.com/li-hao/archive/2011/10/03/2198480.htmltar命令 ...
- hdu_5701_中位数计数
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5701 题意:不解释 题解:n^2的方法:sum[j]表示当前枚举的数到第j个数形成的区间里当前数偏离中 ...
- 5.如果第4题中在DOS命令下输入:java Hello 出现以下结果:Bad command or the file name 可能是什么原因?请说明理由。
1.没有输入javac指定路径,而是直接输入java Hello. 2.前面已经用过一次指令,没有重新输入路径.