常用系统io
一些常用的系统io基础
系统IO基本概念
由于Linux系统下的“一切皆文件”,即Linux系统下的数据和程序均以文件形式存储。因而Linux内核提供了一组操作文件的函数接口,通常被称为系统io。
系统io基本API
open
头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型:
int fd = int open(const char *pathname,int flags);
int fd = int open(const char *pathname,int flags,mode_t mode);
成功返回文件描述值(大于0的整数),失败返回-1;
功能:打开指定文件并获得一个文件描述符,或者创造一个新文件
同一个文件可以被多次打开
文件描述值:每打开一次文件就产生一个文件描述值(0、1、2被占用,分别为标准输入、标准输出、标准出错)
pathname为即将要打开的文件,mode 为即将创建的文件的权限(八进制);
flags所代表的参数:(可以用位或的方式同时指定多个模式)
O_RDONLY:只读方式打开文件
O_WRONLY:只写方式打开文件
O_RDWR:读写方式打开文件
O_CREAT:如果文件不存在,创造文件
O_EXCL:如果O_CREAT创造文件存在,返回错误消息
O_NOCTTY:当文件为终端时,阻止该终端成为进程的控制终端
O_TRUNC:当文件已存在时,删除文件中原有数据
O_APPEND:以追加方式打开文件(需配合写模式)
mode 所表示的文件权限(八进制)
| 权限 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
| 字符表示 | r | w | s | r | w | s | r | w | s |
| 数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
| 权限用户 | 文件所有者(usr) | 文件所属组(group) | 其他用户(other) | ||||||
| 数字模式组合介绍 | |||||||||
| 777 | 7(读、写、执行) | 7(读、写、执行) | 7(读、写、执行) | ||||||
| 755 | 7(读、写、执行) | 5(读、执行) | 5(读、执行) | ||||||
| 644 | 6(读、写) | 4(读) | 4(读)
| ||||||
文件描述值
打开文件时,内核会在未分配的文件描述符中分配一个最小的给打开的文件,本质是一个非负整数。
打开文件时,内核会产生一个指向file{}的指针,并将该指针放入一个位于file_struct{}的数组中,而该指针所在数组的下标,被函数open 返回用户,即为文件描述符(int型)。
- 文件描述符从0开始,每打开一个文件,就产生一个新的文件描述符。
- 可以重复打开同一个文件,每次打开文件都会使内核产生系列结构体,并得到不同的文件描述符
- 由于系统在每个进程开始运行时,都默认打开了一次键盘、两次屏幕,因此0、1、2描述符分别代表标准输入、标准输出和标准出错三个文件(两个硬件)。
close
头文件:
#include <unistd>
函数原型:
int close (int fd);
成功返回0,失败返回-1;
功能:关闭文件并释放相应资源。
重复关闭文件或关闭尚未打开的文件是安全的(会有失败返回)
read
头文件:
#include <unistd.h>
函数原型:
size_t read (int fd,void * buf,size_t count);
成功返回读到的字节数,失败返回-1;
fd :文件描述值
buf :缓冲区
count :想要读的字节数
- 参数count是读写字节数的愿望值,实际读写成功的字节数由返回值决定。
- 读取普通文件时,如果当读到了文件尾,read()会返回0。
- 读取管道文件时,如果管道中没有数据,read()默认会阻塞。
write
头文件:
#include <unistd.h>
函数原型:
size_t write (int fd,const void * buf,size_t count);
成功返回写入的字节数,失败返回-1;
fd :文件描述值
buf :即将要写入的数据
count :想要写入字节数
lseek
头文件:
#include <unistd.h>
#include <sys/types.h>
函数原型:
off_t lseek (int fd,off_t offset,int whence);
成功返回新文件位置偏移量,失败返回-1;
fd :文件描述值
offset:新位置偏移量相对于基准点偏移量(可正可负)
whence:
SEEK_SET:文件开头处
SEEK_CUR:当前位置
SEEK_END:文件末尾处
- lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。
- lseek函数只能对普通文件调整文件位置,不能对管道文件调整。
- lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。

浙公网安备 33010602011771号