基本文件操作函数
#include <unistd.h>
int open(int filedes, int filestate, ...); // 失败返回-1, 成功返回文件描述符int close(int filedes);int lseek(int filedes, int offset, int fromwhere); // 随机访问文件,失败返回-1,成功返回文件当前偏移量int read(int filedes, char *buf, int bufsize); // 失败返回-1,成功则返回实际读入的字节数int write(int filedes, const char *buf, int bufsize); // 失败返回-1,成功则返回实际写入的字节数
文件状态标志
O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 O_APPEND 当以写标记打开文件时,以追加到文件末尾的方式写文件 O_TRUNC 当以写标记打开文件时,文件将被截短,这也是默认方式 O_CREAT 若文件不存在则创建它 O_EXCL 若同时指定了O_CREAT,而文件已经存在,则会出错(EEXIST) O_NONBLOCK 以非阻塞方式打开文件(仅对FIFO、块特殊文件和字符特殊文件有效)
lseek函数设置文件偏移时的相对位置常值
SEEK_SET 从文件开始位置计算偏移 SEEK_CUR 从文件当前位置开始计算偏移 SEEK_END 从文件末尾开始计算偏移
内核用于I/O的数据结构
![]()
fd标志指文件描述符标志,文件描述符标志指示进程退出时是否会关闭文件描述符。
文件描述符复制函数
#include <unistd.h>
int dup(int filedes); // 成功则返回复制的文件描述符,失败返回-1
int dup2(int filedes, int filedes1); // 该函数将文件描述符复制为指定值,返回值同上复制后的数据结构如下:![]()
示例程序(相当于cat命令):
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> static const int s_buffSize = 4028; char buff[s_buffSize]; int main(int argc, char* argv[]) { int n = 0; while ((n=read(STDIN_FILENO, buff, s_buffSize)) > 0) { if (write(STDOUT_FILENO, buff, n) != n) { printf("write error! pid=%d\n", getpid()); exit(1); } } exit(0); }