当前课程知识点:基于Linux的C++ >  第十二讲 Linux系统编程基础 >  12.7 输入输出(二) >  LinuxCPP1207

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP1207在线视频

LinuxCPP1207

下一节:LinuxCPP1208

返回《基于Linux的C++》慕课在线视频列表

LinuxCPP1207课程教案、知识点、字幕

然后有一个文件发送函数 sendfile()

它有一个输出的文件描述符

有一个输入的文件描述符

有一个偏移量

有一个文件的长度 叫 count

sendfile() 这个函数

它将在两个文件描述符所代表的文件之间传递数据

它将在两个文件描述符所代表的文件之间传递数据

因为这个传递是一个直接传递

就在内核里直接完成

这个数据之间的拷贝

它事实上是不拷贝

它就把这个数据直接告诉它

我这个数据在这里

你取就完了 相当于共享

所以实际上整个程序运行效率会非常高

但是它有一个特定的限制条件

它的输入文件描述符

必须是支持类似 mmap()

像内存映射这样的函数的

它的文件描述符

必须是这个东西

它的输出必须是一个套接字

这是它的强烈的要求

往往是和网络数据传输有关的

接下来就是数据移动函数 splice()

splice() 这个函数呢

它在两个文件描述符之间传递数据

这个数据依然是移动的

它也仍然是零拷贝的动作

就像 sendfile() 一样

它只是把这个数据搬过去

它并不需要真正地复制这个数据

只是告诉对方

我这个数据在这里 你过来取就完了

所以这两个文件描述符至少有一个必须是管道

所以这两个文件描述符至少有一个必须是管道

接下来的移动函数就是 tee()

这两个文件描述符都必须是管道

它就在两个管道之间移动数据

同样它的效率是很高的

它的性质其实和 splice() 是一样的

最后一个函数是 fcntl()

是控制这个文件访问的

传的参数第一个是文件描述符

第二个参数是控制命令

后边跟着一系列的可选参数

也许有 也许没有

这个函数是需要特别注意的

Linux 很多系统调用的函数

都是以这样的模式来提供的

fd 就对应着这个文件描述符

cmd 对应的就是那个控制命令

这个函数在失败的时候就会返回 -1

并设置 errno 的值

但是如果成功了呢 返回什么呢

那返回的就跟 cmd 这个命令有关

不同的 cmd 命令返回的数据是不一样的

有一些常用的 cmd 命令

比如讲 F_DUPFD、F_DUPFD_CLOEXEC、

F_GETFD、F_SETFD 等等 等等

不同的命令对应的性质

要做的事情肯定是不一样的

这还有呢 一堆呢

F_GETFL、F_SETFL 诸如此类

所有的这些命令都需要同学们

去查阅帮助手册看它的详尽的介绍

去查阅帮助手册看它的详尽的介绍

当你需要用到的时候

你就需要仔细地去研读

我们的课上不可能将所有的这些属性

所有的这些命令 所有的这些参数

一个一个地全部详细解释

没有那个时间去做详尽的解释

还有一个技术主题就是临时文件

在 Linux 操作系统中

我们可以创建临时文件

进行一些内部的输入输出

就在程序运行过程中

你需要创建一些临时文件

来去做一些特定的处理

这些临时文件创建的时候

它遵照一个特定的规则

使用的时候是需要特别注意的

因为在整个程序运行过程中

可能有很多个进程使用同样的代码

他们都在跑

那么当你这样的一个进程

需要创建一个临时文件的时候

你得要保证使用同样代码的进程

所创建的临时文件

它们不是同一个

也就是说 同样的代码要创建临时文件

那么一旦你使用这个同样的代码

启动了好几个进程

那你得保证这些进程所访问的

临时文件名字是不一样的

这是第一个需要注意的

还有当你创建这个临时文件的时候

需要特别的小心

这个临时文件的文件属性

因为没有授权的用户不能够、也不应该

具有临时文件的访问权限

这一点在进行 Linux 系统编程的时候

是需要特别注意的

为了程序的安全性

你在生成临时文件的时候

这个临时文件叫什么名字

外部应该不可预测 也就是说

这个真正的名字应该是随机产生的

这个是在创建临时文件的时候

也是需要注意的

在 Linux 操作系统中

创建临时文件的那个函数名字叫 mkstemp()

它将创建一个名称唯一的一个临时文件

使用什么呢

使用 6 个 “X” 作为它的模板

生成的文件名字的模板

它内部在调用的时候

自动会用一个全局唯一的、随机生成的

自动会用一个全局唯一的、随机生成的

一个 6 个字符来替换这里的 “X”

它替你生成 就那个意思

生成了以后

它就返回那个对应文件描述符给你

你就可以使用那个文件描述符操纵那个文件了

你就可以使用那个文件描述符操纵那个文件了

如果你不希望外界看到你创建的临时文件

如果你不希望外界看到你创建的临时文件

那么简单 在你创建的这个临时文件之后

就调用 unlink() 将这个文件

从这个目录列表中删除掉

就不再链接到我们的目录里

那么别人就看不见了嘛

这个文件本身并没有销毁

但是在目录里就不会显示它

在这个时候文件是采用引用计数器的方式去访问的

在这个时候文件是采用引用计数器的方式去访问的

当本程序没有结束的时候

你使用文件描述符是能够访问到那个对应的文件的

你使用文件描述符是能够访问到那个对应的文件的

当文件的引用计数器降为 0 的时候

这个文件自动地就会删掉了

外界又看不见

就你内部用完了

用完以后你就删掉了

临时文件必须按照这个模式进行操作

我们看临时文件读写的例子

我们实现一个函数 WriteToTempFile()

向临时文件里写数据

我们以这个名字创建临时文件

在 tmp 目录下边定义一个 “temp_file.XXXXXX” 这样的文件名

在 tmp 目录下边定义一个 “temp_file.XXXXXX” 这样的文件名

然后把它初始化给我们的 temp_filename

然后我们调用 mkstemp()

创建一个临时文件

返回它的文件描述符 你不用管

它那 6 个 “X”

它用什么字符来填充的

反正它会创建一个全局唯一的

然后 unlink() 取消这个文件的链接

这样的话我们目录列表里边

就不会显示这个临时文件了

当你关闭了这个文件描述符之后

没有别的进程再用它了嘛

它的引用计数器就会降为 0

然后那个文件自动就会删除掉

我们接下来就可以调用 write() 函数

向临时文件里写数据

如果你这个程序内部

还需要继续用这个文件

那么就可以就继续使用

它的 fd 文件描述符来访问那个临时文件

这是 WriteToTempFile()

接下来就是 ReadFromTempFile()

那么我们可以使用传过来的这个文件描述符

那么我们可以使用传过来的这个文件描述符

对这个文件进行定位

比如讲我们定位到文件的开头

然后我们调用 read() 函数去读取它的内容

读完了以后关闭我们的文件描述符

close(fd) 我们就不用了

这个时候临时文件就会被删除掉

这就是临时文件的读写操作

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP1207笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。