概述
1.简介
Linux系统中的大多数文件I/O只需用到5个函数:open、read、write、lseek以及close。
文件I/O是不带缓冲的I/O,它不是ISO C的组成部分。
2.文件描述符
对于内核而言,所有打开的文件都通过文件描述符引用。
文件描述符是一个非负整数。
文件描述符0、1、2分别关联进程的标准输入、标准输出、标准错误。
在头文件<unistd.h>
中,标准输入、标准输出和标准错误分别定义为常量STDIN_FILENO
、STDOUT_FILENO
和STDERR_FILENO
。
3.open函数
#include <fcntl.h>
int open(const char *pathname, int oflag, .../* mode_t mode*/);
// 返回值:若成功则返回文件描述符,若出错则返回-1
- pathname是要打开或创建文件的路径。
- oflag用来说明文件的打开方式,用下列一个或多个常量进行或运算:
O_RDONLY // 只读打开
O_WRONLY // 只写打开
O_RDWR // 读、写打开
/* 以上必选一个,以下是可选项:*/
O_APPEND // 写时追加到文件末尾
O_CREAT // 若文件不存在,则创建
O_EXCL // 测试文件是否存在,不存在则创建
O_TRUNC // 把文件长度截短为0
O_NOCTTY // 不作为此进程的控制终端
O_NONBLOCK // 非阻塞模式
O_DSYNC // 每次write等待物理I/O完成,但不等待文件属性更新
O_RSYNC // 每次read都等待对文件同一部分的写操作完成
O_SYNC // 每次write等待物理
4.creat函数
#include <unistd.h>
int creat(const char* pathname, mode_t mode);
// 返回值:若成功则返回文件描述符,若出错则返回-1
creat是以只写方式打开所创建的文件。
5.close函数
#include <unistd.h>
int close(int filedes);
// 返回值:若成功则返回0,若出错则返回-1
关闭一个文件时还会释放该进程加在该文件上的所有记录锁。
6.lseek函数
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
// 返回值:若成功则返回新的文件偏移量,若出错则返回-1
- 若whence是
SEEK_SET
,则文件的偏移量设置为offset个字节; - 若whence是
SEEK_CUR
,则将文件的偏移量设置为当前值加offset个字节; - 若whence是
SEEK_END
,则将文件的偏移量设置为文件长度加offset个字节。
7.read函数
#include <unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes);
// 返回值:若成功则返回读到的字节数,若已到文件结尾则返回0,若出错则返回-1
read函数从文件的当前偏移量处开始读,在成功返回之前,该偏移量将增加实际读到的字节数。
8.write函数
#include <unistd.h>
ssize_t write(int filedes, const void *buf, size_t nbytes);
// 返回值:若成功则返回已写的字节数,若出错则返回-1
write函数出错的一个常见原因是:磁盘已写满,或者超过了一个给定进程的文件长度限制。
9.原子操作
#include <unistd.h>
ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);
// 返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1
ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);
// 返回值:若成功则返回已写的字节数,若出错则返回-1
- pread/pwrite相当于顺序调用lseek和read/write,区别在于:多进程同时读写同一个文件时,lseek和read/write操作之间不会被打断。
- open函数的参数O_EXCL也是原子操作,把“检查文件是否存在”和“创建文件”两个操作合成一个整体,保证不会被打断。
10.dup和dup2函数
#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, int filedes2);
// 两函数的返回值:若成功则返回新的文件描述符,若出错则返回-1
- dup返回的新文件描述符一定是当前可用文件描述符的最小值。
- 如果调用dup2时filedes2已打开,则会先将其关闭再打开。
- 如果filedes等于filedes2,则dup2返回filedes2,而不关闭它。
11.sync、fsync和fdatasync函数
#include <unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
// 返回值:若成功则返回0,若出错则返回-1
void sync(void);
- sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,不等待实际的写磁盘操作结束。
- fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待实际的写磁盘操作再返回。
- fdatasync函数类似于fsync,但它只影响文件的数据部分。
最后
以上就是缓慢白猫为你收集整理的《Unix环境高级编程》---系统调用IO的全部内容,希望文章能够帮你解决《Unix环境高级编程》---系统调用IO所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复