常用系统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:文件末尾处

  1. lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。
  2. lseek函数只能对普通文件调整文件位置,不能对管道文件调整。
  3. lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。
posted @ 2024-08-10 15:24  do泽  阅读(51)  评论(0)    收藏  举报