《深入理解计算机系统》第十章——系统级I/0
目录
10.1Unix I/O
10.2文件
10.3打开和关闭文件
10.4读和写文件
10.5用RIO包建壮地读写
10.6读取文件元数据
10.7读取目录内容
10.8共享文件
10.9 I/O重定向
10.10 标准I/O
10.1Unix I/O
在Linux中,一切皆为文件。
文件I/O函数-------打开文件、读文件、写文件
对于内核而言 ,所有打开的文件都通过文件描述符引用!(早期的上限是19 现在是63)
0-----------标准输入
1------------标准输出
2-----------标准错误
10.2文件
10.3打开和关闭文件
O_RDONLY 只读打开O_WRONLY 只写打开O_RDWR 读写打开O_EXEC只执行打开O_SEARCH 只搜索打开O_APPEND 每次写时都追加到文件的尾端O_CLOEXEC 把FD_CLOEXEX常亮设置为文件描述符标志O_CREAT 若此文件不存在则创建它O_EXCL 如果同时指定O_creat,而文件已存在,则出错。检测一个文件是否存在,不存在则创建它O_TRUNC 如果此文件存在,而且为只写或读—写打开 则将其长度截止为0O_DIRECTORY:如果pathname引用的不是目录,则出错
文件的创建和打开
读写文件前,用户程序须告知将对文件进行何种操作:读、写、添加还是可读可写,通过打开或创建一个文件来实现。
已存在的文件:可直接打开 不存在的文件:则先创建
1. 创建文件:int creat(char *name, mode_t perms);
创建新文件时,应指定文件名和访问权限,系统返回一个非负整数,它被称为文件描述符fd (file descriptor)。
文件描述符用于标识被创建的文件,在以后对文件的读写等操作时用文件描述符代表文件。
2. 打开文件:int open(char *name, int flags, mode_t perms);
标准输入(fd=0)、标准输出(fd=1)和标准错误(fd=2)三种文件自动打开其他文件须用creat或open函数显式创建或打开后才能读写
参数perms用于指定文件的访问权限,通常在open函数中该参数总是0除非以创建方式打开,此时,参数flags中应带有O_CREAT标志。
参数flags:O_RDONLY, O_WRONLY|O_APPEND, O_RDWR等 例:fd=open(“test.txt”,O_RDONLY, 0);
文件的定位和关闭
3. 设置读写位置:long lseek(int fd, long offset, int origin);
offset指出相对字节数 origin指出基准:开头(0)、当前位置(1)和末尾(2)例:lseek(fd,5L,0);表示定位到文件开始后的第5字节 lseek(fd, 0L, 2);表示定位到文件末尾 返回的是位置值,若发生错误,则返回-1
4. 元数据统计:int stat(const *name, struct stat *buf);
int fstat(int fd, struct stat *buf);
文件的所有属性信息,包括:文件描述符、文件名、文件大小、创建时间、当前读写位置等,由内核维护,称为文件的元数据(metadata)。 用户程序可通过stat()或fstat()函数查看文件元数据。 stat第一个参数是文件名,而fstat指出的是文件描述符,除第一个参数类型不同外,其他全部一样。
5. 关闭文件:close(int fd);
10.4读和写文件
文件的读/写
6. 读文件:ssize_t read(int fd, void *buf, size_t n);
将fd中当前位置k开始的n个字节读到buf中,读后当前位置为k+n。若文件长度为m,当k+n>m时,则读取字节数为m-k<n,读后当前
位置为文件尾。返回实际字节数,当m=k(EOF)时,返回值为0。
7. 写文件:ssize_t write(int fd, const void *buf, size_t n);将buf中n字节写到fd中,从当前位置k处开始写。返回实际写入字节
数m,写后当前位置为k+m。对于普通文件,实际字节数等于n。对于read和write系统调用,可以一次读/写任意个字节。显然,按一个物理块大小读/写较好,可减少系统调用次数。有些情况下,真正读/写字节数比设定所需字节数少,这并不是一种错误。在读/写磁盘文件时,除非遇到EOF,否则不会出现这种情况。但当读/写的是终端设备或网络套接字文件、UNIX管道、Web服务器等都可能出现这种情况。是不带缓冲的读写:直接从(向)磁盘读(写),没有缓冲
10.5用RIO包建壮地读写
10.6读取文件元数据
The following POSIX macros are defined to check the file type using the st_mode field:S_ISREG(m) is it a regular file?这是一个普通文件吗?S_ISDIR(m) directory?这是一个目录文件吗?S_ISCHR(m) character device?S_ISBLK(m) block device?S_ISFIFO(m) FIFO (named pipe)?S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)S_ISSOCK(m) socket? 这是一个网络套接字吗?
stat数据结构如下:
/* Metadata returned by the stat and fstat functions */
struct stat {dev_t st_dev; /* Device */ino_t st_ino; /* inode */mode_t st_mode; /* Protection and file type */nlink_t st_nlink; /* Number of hard links */uid_t st_uid; /* User ID of owner */gid_t st_gid; /* Group ID of owner */dev_t st_rdev; /* Device type (if inode device) */off_t st_size; /* Total size, in bytes */unsigned long st_blksize; /* Blocksize for filesystem I/O */unsigned long st_blocks; /* Number of blocks allocated */time_t st_atime; /* Time of last access */time_t st_mtime; /* Time of last modification */time_t st_ctime; /* Time of last change */
};
10.7读取目录内容
10.8共享文件
ffiles1.c
#include "csapp.h"
int main(int argc, char *argv[])
{int fd1, fd2, fd3;char c1, c2, c3;char *fname = argv[1];fd1 = Open(fname, O_RDONLY, 0);fd2 = Open(fname, O_RDONLY, 0);fd3 = Open(fname, O_RDONLY, 0);Dup2(fd2, fd3);Read(fd1, &c1, 1);Read(fd2, &c2, 1);Read(fd3, &c3, 1);printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3);return 0;
}
ffiles2.c
#include "csapp.h"
int main(int argc, char *argv[])
{int fd1;int s = getpid() & 0x1;char c1, c2;char *fname = argv[1];fd1 = Open(fname, O_RDONLY, 0);Read(fd1, &c1, 1);if (fork()) { /* Parent */sleep(s);Read(fd1, &c2, 1);printf("Parent: c1 = %c, c2 = %c\n", c1, c2);} else { /* Child */sleep(1-s);Read(fd1, &c2, 1);printf("Child: c1 = %c, c2 = %c\n", c1, c2);}return 0;
}
#include "csapp.h"int main(int argc, char *argv[])
{int fd1, fd2, fd3;char *fname = argv[1];fd1 = Open(fname, O_CREAT|O_TRUNC|O_RDWR, S_IRUSR|S_IWUSR);Write(fd1, "pqrs", 4); fd3 = Open(fname, O_APPEND|O_WRONLY, 0);Write(fd3, "jklmn", 5);fd2 = dup(fd1); /* Allocates new descriptor */Write(fd2, "wxyz", 4);Write(fd3, "ef", 2);Close(fd1);Close(fd2);Close(fd3);return 0;
}/*abcde.txt
pqrswxyzef
*/
fd2 = dup(fd1);,意思就是fd2指向了fd1的位置
运行结果:pqrswxyznef
10.9 I/O重定向
I/O重定向详解
10.10 标准I/O
c语言定义了一组高级输入输出函数,称为标准I/O库,为程序员提供了UnixI/O的较高级别的替代。
相关文章:

终于完成了“微软”化
整整忙活了一个下午,基本上我的笔记本完成了可怕的“微软”化进程!是的,当我完成FOXMAIL中邮件向OUTLOOK2007的迁移后,在办公层面,已经完成“微软”化了。其实真的不想这样,但是想MS在独霸桌面后࿰…

C#创建Windows服务
利用VS.NET创建C# Windows服务在很多应用中需要做windows服务来操作数据库等操作,比如 (1)一些非常慢的数据库操作,不想一次性去做,想慢慢的通过服务定时去做,比如定时为数据库备份等 (2&#x…

《深入理解计算机系统》第七章——链接知识点总结
目录 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 7.5符号和符号表 7.6符号解析 • 静态库(.a archive files) 7.1编译器驱动程序 7.2静态链接 7.3目标文件 7.4可重定位目标文件 使用readelf -S查看hello.o 一个典型的ELF可重定位目标文件包含以下…
排序算法之直接插入排序
1、基本思想: 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成关键字非递减有序序列为止。 具体操作如下: (1)查找出r[i]在有序序列…

【代码片段】如何使用CSS来快速定义多彩光标
对于web开发中,我们经常都看得到需要输入内容的组件和元素,比如,textarea,或者可编辑的DIV(contenteditable) ,如果你也曾思考过使用相关方式修改一下光标颜色的,那么这篇技术小分享,你绝对不应…

如何划分155MSDH带宽
我们单位拟计划租用运营商155MSDH电路,由于我们单位应用业务较多,为了避免各业务之间相互影响,更好地分享带宽,根据各业务数据量的大小,分别赋予一定的带宽,使各业务在自己的带宽内传输,但不知选…

慕课袁春风老师《计算机系统基础》一二三部分练习题
2.2 1、下列几种存储器中,( A )是易失性存储器。 A. cache B. EPROM C. Flash Memory D. CD-ROM 2、下面有关半导体存储器组织的叙述中,错误的是( D )。 A. 存储器的核心部分是存储阵列,…

47种常见的浏览器兼容性问题大汇总
浏览器兼容性问题大汇总 JavaScript 31. HTML对象获取问题 32. const问题 33. event.x与event.y问题 34. window.location.href问题 35. frame问题 36. 模态和非模态窗口问题 37. firefox与IE的父元素(parentElement)的区别 38. document.formName.item(”itemName”) 问题 39.…
封装了一下我佛山人4.0 (支持vs2005)asp.net 页面验证
第一次写控件,拿“我佛山人4.0”开个刀,实际上也不算是什么控件,只是封装了一下,方便在asp.net中使用。 建议先看“我佛山人 4。0”文档。 声明:控件中参考了不少网上的源码,大家不要觉得眼熟BS人啊。注&am…

九章算法班L8 Array Number
转载于:https://www.cnblogs.com/sissie-coding/p/10295478.html

linux密码时效更改方法
密码时效 按目前的形势,已有更强大的硬件大大地缩短了利用自动运行的程序来猜测密码的时间。因此在UNIX系统中防止密码被***的别一方法就是要经常地改变密码。很多时候,用户却不改变密码。因此一种机制用来强制规律性的更改密码是合乎要求的。这种技术称…

YOLOv10训练自己的数据集
至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

安卓相对布局常用语句
不BB写在自己博客园看的舒服 RelativeLayout布局 android:layout_marginTop"25dip" //顶部距离 android:gravity"left" //空间布局位置 android:layout_marginLeft"15dip //距离左边距 // 相对于给定ID控件 android:layout_above 将该控件的底部置于…

Tomcat V6 Examples移植到Apusic V5.1
目标:将Tomcat V6的的例子Examples移植到Apusic V5.1上术语:Tomcat:只提供了WEB容器的开源服务器;Apusic:提供了完整的J2EE支持的商用服务器;%TOMCAT_HOME%:Tomcat安装目录%APUSIC_HOME%&#x…

Android 活动与活动间数据传递--登录注册页面
AndroidManifest.xml: <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"package"com.example.myapplica…

使用SVG中的Symbol元素制作Icon
前言 随着大屏幕分辨率的普及以及各种移动设备层出不穷的移动互联网时代的到来,我们在网站设计时更应该关心内容在各种设备上的阅读性和显示效果。我们都希望能在任何时间,任何设备上都能清楚的,高效的传递信息给用户。 而随着各种高清视网膜…

【JOURNAL】恭喜发财
刚写完上一条blog不久,南京城里开始响彻了鞭炮声,人见人爱、极具亲和力的财神来了。上海的一个朋友发短信来说那个国际化大都市也被对财神的膜拜感染得热闹喧天。这是好的。昨天给老婆表亲家的孩子压岁钱,对方说免了吧,我坚持让他…

[树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏。这个游戏是这样的:有一棵n个点的以1为根的有根树,叶子有权值。假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列。一开始在1号点有一颗棋子。两人轮流将这颗棋子移向其当前位置的一个儿子。假…

ASP.NET获取IP的6种方法
服务端: //方法一HttpContext.Current.Request.UserHostAddress; //方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName System.Net.Dns.GetHostName();stringclientIPAddress System.Net.Dns.GetHostAddresse…

软件工程实践第一次作业
准备篇 一、回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 在读到博文B时,博客B[1]的作者说道:“ 那时,对其他学校认知的匮乏让自己无助起来,最后的抉择,是希望选择一个…

VC 6.0不老
最近做的几个项目,客户都是要求使用Vc 6开发,我用的是VC 6.0 Sp6。VC 6 装上插件之后发现使用方便多了,下面是转载[url]http://hi.baidu.com/linuxtoys/blog/item/5f4251a9f12a53fd1e17a272.html[/url] 的一篇关于VC6的小插件的文章ÿ…

[03] 处理注解:反射
1、AnnotatedElement接口如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了。使用注解的过程中,很重要的一部分就是创建于使用注解处理器。Java SE5扩展了反射机制的API,以帮助程序员快速的构造自定义注解处理器。Java用An…

P2261 [CQOI2007]余数求和
我是题面 题意还是很清晰,很容易理解 1e9范围明显不能暴力,除非你能把常数优化到\(\frac1 {10}\),但我实在想象不到用了这么多取模怎么把常数优化下去 我们可以把\(k\%i\)变成\(k-k/i*i\)(整除) 那么总的和也就从\(\sum_{i1}^{n}k\%i\)变成了…

Windows Server 2008正式版[微软官方下载地址+官方语言包]
Windows Server 2008(包含 Standard Enterprise Datacenter)32http://download.microsoft.com/download/d/d/b/ddb17dc1-a879-44dd-bd11-c0991d292ad7/6001.18000.080118-1840_x86fre_Server_en-us-KRMSFRE_EN_DVD.iso64http://download.microsoft.com/download/d/d/b/ddb17dc1…

线性代数-矩阵-【5】矩阵化简 C和C++实现
点击这里可以跳转至 【1】矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html 【2】矩阵生成:http://www.cnblogs.com/HongYi-Liang/p/7275278.html 【3】矩阵加减:http://www.cnblogs.com/HongYi-Liang/p/7287403.html 【4】矩阵…

哈佛管理论丛:谁背上了令人讨厌的猴子
先说说我的读后感想: 在团队管理中,应该尽量明晰的界定每一位团队成员在当前的任务中充当的角色和应该负责的职责。 实际的执行方法就是:约定好给猴子喂食的时间,并且确定在喂食时间到来时,猴子应该长成什么样子。 所以…

json_encode 中文不乱码
echo json_encode("中文", JSON_UNESCAPED_UNICODE);//"中文" 转载于:https://www.cnblogs.com/zxqblogrecord/p/10300244.html
Android-room的学习
目录 关于ROOM 1.Room有3个主要的组件 2.Room 不同组件之间的关系如图所示 3.导入ROOM(使用 Room 需要添加依赖) 4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置 实例demo 1.Student.java …

JDK5中的控制台输入
Scanner类是JDK5新添加的一个类,主要作用是处理输入流、文件和文本内容等 。这个类在java.util包里面,实现了Iterator接口,而且io处理采用了jdk1.4才发布的nio。由于这个类实现了Iterator接口,如果全部是string的话,就…