linux文件I/O编程 (open、read、write、lseek、close)

时间:2021-08-08 07:50:32

AP I/O 笔记

文件的原子操作(stdio)

可用的文件I / O函数——打开文件、读文件、写文件等等。大多数Linux文件I / O只需用到5个函数:openreadwritelseek 以及close

不带缓存指的是每个readwrite都调用内核中的一个系统调用。这些不带缓存的I / O函数不是ANSI C的组成部分,而是POSIX(Portable Operating System Interface of Unix UNIX型可植操作系统接口)组成部分。

对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用opencreat返回的文件描述符标识该文件,将其作为参数传送给readwrite

POSIX.1应用程序中,整数012应被代换成符号常数:

1. 

2. STDOUT_FILENO

3. STDERR_FILENO

这些常数都定义在头文件 <unistd.h>中。

文件描述符的范围是0 ~ OPEN_MAX 。早期的UNIX版本采用的上限值是1 9 (允许每个进程打开2 0个文件),现在很多系统则将其增加至256

 

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

POSIX 函数部分

打开文件open :

函数名 open
功  能: 打开文件
用  法 int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ; 

返 值: 若成功为文件描述符,若出错为-1,出错时errno被设置

说  明: pathname是要打开或创建的文件的名字。

oflag参数可用来说明此函数的多个选择项。

对于open函数而言,仅当创建新文件时才使用第三个参数。

oflag: O_RDONLY  只读打开

O_WRONLY  只写打开此 三者必须选一

O_RDWR  读、写打开

O_APPEND  每次写时都加到文件的尾端

O_CREAT  若此文件不存在则创建它。使用此选择项时,需同时说明第三个 参数mode ,用其说明该新文件的存取许可权位

O_EXCL  如果同时指定了O_CREAT ,而文件已经存在,则出错。这可 测试一个文件是否存在,如果不存在则创建此文件成为一个原子 操作

O_TRUNC  如果此文件存在,而且为只读或只写成功打开,则将其长度截短 为0

O_NOCTTY  如果pathname 指的是终端设备,则不将此设备分配作为此进程 的控制终端

O_NONBLOCK  如果pathname 指的是一个FIFO 、一个块特殊文件或一个字符 特殊文件,则此选择项为此文件的本次打开操作和后续的I / O  操作设置非阻塞方式

O_SYNC  使每次write 都等到物理I / O 操作完成

mode: S_IRWXU  用户主的读写和执行权

S_IRUSR  用户读

S_IWUSR 用户写

S_IXUSR 用户执行

S_IRWXG  组的读写执行

S_IRGRP  组读

S_IWGRP  组写

S_IXGRP  组执行

S_IRWXO  其它人的读写执行

S_IROTH  其它人读

S_IWOTH  其它人写

S_IXOTH  其它执行

打开文件creat:

函数名 creat
功  能: 创建一个新的文件
用  法 int creat(const char * pathname, mode_t mode); 

返 值: 若成功为只写打开的文件描述符,若出错为- 1; 

说  明: 一般都直接用 open来创建了

eg:

关闭文件close:

函数名 close
功  能: 关闭一个打开文件
用  法 int close (int filedes); 

返 值: 若成功为0,若出错为- 1; 

说  明: 当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用

这一功能而不显式地用close关闭打开的文件。

eg:

#include <unistd.h>

定位已打开文件lseek:

函数名 lseek
功  能: 设置文件内容读写位置
用  法 off_t lseek(int filesdes, off_t offset, int whence); 

返 值: 若成功为新的文件位移,若出错为- 1; 

说  明:whenceSEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。

whenceSEEK_CUR ,则将该文件的位移量设置为其当前值加offsetoffset 可为正或负。

whenceSEEK_END ,则将该文件的位移量设置为文件长度加offsetoffset 可为正或负。。

eg:

读文件read:

函数名 read
功  能: 从打开文件中读数据
用  法 ssize_t read(int fd, void *buf, size_t count);

返 值: 读到的字节数,若已到文件尾为0,若出错为- 1; 

写文件write:

函数名 write
功  能: 从打开文件中写数据
用  法 ssize_t write(int fd, const void *buf, size_t count);

返 值: 若成功为已写的字节数,若出错为- 1;

ssize_t pread(int filedes, void *buffer, size_t size, off_t offset)

ssize_t pwrite(int filedes, const void *buffer, size t size, off_t offset)

类似于readwrite,只是读写不是从文件当前位置开始,而是

offset位置开始,并且函数执行完后也不影响当前文件指针位

置,即指针位置不改变。