文章目录
接下来我将介绍Linux当中与IO有关的知识,下面是本章节的思维导图,接下来的几篇博客我将按照思维导图的划分进行讲解。

思维导图获取
提取码: m9cz
IO操作
语言级IO操作
在介绍系统级别的IO操作之前,我们先来回顾一下语言级别的IO操作。这里就以C语言中的IO操作为例了。
在C语言中,我们首先需要打开一个文件,使用的函数就是fopen,fopen可以指定以何种方式去打开文件,如: 以只读的方式、以只写的方式、以追加的方式等。
在打开文件之后,我们就可以写入或读取这个文件了。C语言中,文件的写入操作有fputs、fwrite、fprintf等。文件的读取操作有fgets、fread、fscanf等。下面给出一个C语言中常用的文件操作函数的接口及其功能的解释。
C语言文件操作函数接口功能fopen打开文件
可以指定打开的方式fputc向文件中写入一个字符fputs向文件中写入一个字符串fwrite向文件中写入指定数量的全部字符fprintf以格式化的方式输入到文件中fgetc从文件中读取一个字符fgets从文件中读取n个字符(会读取\n)fread从文件中读取指定数量的全部字符fscanf以格式化的方式读取文件中的数据fseek将文件指针移动到 特定的偏移量的位置ftell返回文件指针相对于起始的偏移量rewind让文件指针回到起始的位置fclose关闭文件
问题:为什么我们可以直接 printf 和 scanf?
任何进程在运行的时候,都会默认打开的3个输入/输出流
stdin ( 键盘 ) :标准输入
stdout ( 显示器 ) :标准输出
stderror ( 显示器 ) :标准错误
他们三个流的类型都是FILE*类型的文件指针,就和我们打开文件一样,我们往往使用一个FILE *的指针去接收fopen函数的返回值。
系统级IO操作
为什么我要在前面讲C语言的文件操作接口呢?因为接下来的系统级的IO接口和C语言中的接口非常相似,相似到只要你知道函数名你几乎它是干什么的了。
open
- int open(const char* pathname, int flags);
- int open(const char* pathname, int flags, mode_t mode);
- //包含于:<sys/types.h> <sys/stat.h> <fcntl.h>
复制代码
参数:
pathname:要打开或创建的 目标文件 //支持相对路径和绝对路径
flag:传参标志位
flag参数有以下几种,可以传1个或多个。使用多个时,用“|”或运算符连结。
O_RDONLY:只读打开
O_WRONLY:只写打开
O_RDWR :读、写 打开
O_CREAT :若文件不存在,则创建它。使用该选项时,必须要用mode选项指定新文件的权限
O_APPEND :追加 写
mode:当创建新文件时,对权限的设置。如:0666 (注意,该权限还需要与umask进行运算)
返回值:
成功:返回新打开文件的文件描述符 (我下面会详细讲,类似C语言中的文件指针,但是它是个int)
失败:-1
演示:
- umask(0004);
- int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
- //创建一个文件并以只写的方式打开,文件的权限设置为0666 (还需要与umask值进行运算)
复制代码
close
- int close(int fd); //关闭指定的文件描述符fd
复制代码
write
- ssize_t write(int fd, const void* buf, size_t count);
复制代码
参数:
fd:文件描述符
buf:要写入的字符串
count:要写入的字符个数
read
- ssize_t read(int fd, void* buf, size_t count);
复制代码
参数:
fd:文件描述符
buf:从文件中读取的字符所存放的空间
count:传入你要读取的字符个数
函数使用演示
- //测试write
- #include <iostream>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- using namespace std;
- int main()
- {
- umask(002);
- int fd = open("log.txt", O_WRONLY | O_CREAT, 0666);
- char buff[64] = "write some buffer to log.txt\n";
- write(fd, buff, sizeof(buff));
-
- close(fd);
- return 0;
- }
复制代码

[code]//测试read#include #include #include #include #include using namespace std; int main(){ int fd = open("log.txt", O_RDONLY); char buffer[64]; read(fd, buffer, sizeof(buffer)); cout |