第十章I/O

系统级i/o

开始进程时的三个标准:

标准输入(描述符0):STDIN_FILENO

标准输出(描述符1):STDOUT_FILENO

标准错误(描述符2):STDERR_FILENO

文件位置:

从文件开头起始的字节偏移量k。应用程序能够通过执行seek操作,显式设置文件当前位置

open函数参数 :

基本格式:open(char *file, int flags,mode_t mode)

file:

文件名带双引号表示

flags:

O_RDONLY:只读

O_WRONLY:只写

O_RDWR:可读可写

mode:

指定新文件的访问权限位,与后面的umask函数互用定义,在创建新文件利用

umask:

在打开文件前使用函数umask(umask)进行设置,参数可以先定义

返回值:

所在描述表的位置数值(int),出错为-1

注意事项:

可以定义各项参数值,只要带有头文件即可,具体实例后面练习有参考

read and whrite读和写文件:

基本格式:read/write(int fd,const void *buf, size_t n)

fd:

源文件的描述符

n:

拷贝最多n个字节

buf:

目标存储器位置

返回:

若成功则为实际传送的字节数量;-1表示错误;0表示EOF

特别情况:

读时遇到EOF:不足值表示为0

从终端读文本行:行不足值等于文本行大小

读和写网络套接字:网络不足值表示

RIO包健壮包利用:

RIO包会自动处理不足值。RIO提供了两类不同的函数:

1 无缓冲的输入输出函数:

这些函数直接在存储器和文件之间传送数据,没有应用级缓冲,他们对将二进制数据读写到网络和从网络读写二进制数据尤其有用

2 带缓冲的输入函数:

这些函数允许你高效地从文件中读取文本行和二进制数据,这些文件的内容缓存在应用级缓冲区内,类似于像printf这样的标准I/O函数提供的缓冲区。

是线程安全的,它在同一个描述符上可以被交错地调用。例如,可以从一个描述符中读一些文本行,然后读取一些二进制数据,接着再多读取一些文本行。

stat/fstat读取文件元数据

基本格式:int stat(const filename, struct stat buf)/ int fstat(int fd, struct *buf);

stat以文件名为输入,fstat以文件描述符为输入

返回:成功为0;出错为-1

共享文件

父子进程共享文件:子进程会有一个父进程描述符表项的副本,父子进程打开相同的文件表集合,共享相同的文件位置。在内核删除相应的文件表表项之前,父子进程都必须关闭相应的描述符表项。

文件表:当前文件位置,引用计数(当前指向该表项的描述符项数),以及一个指向V-node表对应表项的指针

v-node表:包括st_mode和st_size成员

重定向

dup2函数:

基本格式:int dup2(int oldfd,int newfd)

功能描述:dup2函数拷贝描述符表表项oldfd到描述符表表项newfd,覆盖描述表表项newfd以前的内容。如果newfd已经打开,dup2会在拷贝oldfd之前关闭newfd

注意事项:在调用函数时旧文件没有引用

练习:

参考资料:

课本

时间: 2024-08-25 19:51:43

第十章I/O的相关文章

Linux与云计算——第二阶段 第十章:Samba服务器架设—SMB共享目录及多用户SMB挂载

Linux与云计算--第二阶段Linux服务器架设 第十章:Samba服务器架设-SMB共享目录及多用户SMB挂载 通过SMB共享目录 在Server上配置SMB服务 您的SMB服务器必须是STAFF工作组的一个成员 共享/common目录 共享名必须为common 只有example.com域内的客户端可以访问common共享 common必须是可以浏览的 用户andy必须能够读取共享中的内容,如果需要的话,验证密码是redhat [1] 安装配置Samba. [[email protecte

第十章、epub文件处理 -- 样式处理

第十章.epub文件处理 -- 样式处理 这一章的内容比较简单,因为第九章中集中了篇幅介绍显示的流程,所以把处理样式的流程单独列一章来介绍. 对样式的处理包含两个部分:第一是创建样式,第二是应用样式. 创建样式 创建样式的过程其实就是对样式文件的解析.1.0的版本中是直接去读取程序内置的资源文件style.xml,这个文件的位置是在assets\default内. 我们曾在第二章中介绍过如果通过解析资源文件来获得要显示在进度条上的文字.style.xml文件也是资源文件,所以两者在解析的过程中是

第十章 运算符重载

第十章 运算符重载 1.运算符重载的方法 (实质:函数重载) *一般格式: 函数类型名operator 运算符名称(参数表){函数体:} 2.运算符重载的规则 *不允许定义新的运算符 *允许重载的运算符 双目运算符 +(加法)  - (减法)  * (乘法) / (除法)   %(取模) 关系运算符 ==(等于) != (不等)  <   >   <=   >= 逻辑运算符 ||(或)   && (与)  !(非) 单目运算符 + (正)  -(负)   *(指针)

EFFECTIVE JAVA 第十章 并发

EFFECTIVE  JAVA  第十章  并发 66.同步访问共享的可变数据 *java语言规范保证读或写一个变量是原子的(可以保证返回的值是某个线程保存在该变量中的),除非这个变量的类型为long或double.(但并不保证一个线程写入的值对于另一个线程是可见) *synchronized修饰方法.synchronized代码块可以实现同步 *volatile修饰的变量只保证读取的是主存里最新的值而不是内存中该值的拷贝,使用volatile变量必须遵循(即变量真正独立于其他变量和自己以前的值

zabbix专题:第十章 zabbix之SNMP方式监控

zabbix专题:第十章 zabbix之SNMP方式监控 (SNMP基本都是监控网络设备,本文介绍点理论知识) 概述 如果我们需要监控打印机.路由器.UPS等设备,肯定不能使用zabbix agentd,因为他们不能安装软件的,还好他们一般都支持SNMP协议,这样我可以使用SNMP来监控他们.如果你希望使用SNMP agent来获取这些设备的信息,那么在安装zabbix server的时候你需要增加snmp的支持. 备注:SNMP检查基于UDP协议 配置SNMP监控 使用SNMP来监视设备,需要

读书笔记第十章

第十章 打印内核的调试信息printk: printk与printf区别: printk 函数该函数的用法与printf函数类似,具不过printk函数运行内核空间,printk函数运行在用户空间.也就是说,像Linux驱动这样的Linux内核程序只能使用prink函数输出调试信息. 其次应该防止printk函数可以很方便地将消息写入日志文件或控制台,但是大量使用printk函数频繁操作日志文件或控制台设备文件会严重影响Linux驱动的性能,因此这就要求Linux驱动只在开发阶段使用printk

C++ primer 第十章

关联容器,完全没用过,一直想用,FUC,本文只介绍初级使用方式,不能贪多 #include<iostream> #include<map> #include<set> #include<string> using namespace std; typedef pair<int,string> Auth; int main() { map<int,string> m; set<string> s; Auth p1,p2,p3

构造之法第九、十章

第九章 项目经理 PM,M就是Manager,但是P有这几种:Product Manager.Project Manager.Program Manager Product Manager:产品经理--正确的做产品 Project Manager:项目经理--正确的做流程 Program Manager:微软的职位名称 PM的能力要求和任务 1.观察.理解和快速学习能力 2.分析管理能力 3.一定的专业能力 4.自省的能力 5.PM和乐团指挥 6.PM和风险控制 第十章 典型用户和场景 典型用户

c++ primer 5th 笔记:第十章

第十章:泛型算法 笔记 1. 标准库并未给每个容器添加大量功能,而是提供了一组算法,这些算法(通用的)中的大多数都独立于任何特定的容器. 2. 大多数算法都定义在头文件algorithm中,另外在头文件numeric中定义了一组数值泛型算法. 3. 保证算法有足够的元素空间开容纳输出数据的方法是使用插入迭代器,back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器: vector<int> vec; // 空向量 auto it = back_inserter(ve

操作系统思考 第十章 条件变量

第十章 条件变量 作者:Allen B. Downey 原文:Chapter 10 Condition variables 译者:飞龙 协议:CC BY-NC-SA 4.0 像上一章所展示的那样,许多简单的同步问题都可以用互斥体解决.这一章中我会介绍一个更大的挑战,著名的"生产者-消费者"问题,以及一个用于解决它的新工具,条件变量. 10.1 工作队列 在一些多线程的程序中,线程被组织用于执行不同的任务.通常它们使用队列来相互通信,其中一些线程叫做"生产者",向队列