文件I/O

五个主要的函数:open read write close lseek
文件描述符
对于操作系统内核来说,所有打开的文件都通过文件描述符引用;文件描述符(fd)是非负整数;

0:标准输入 STDIN_FILENO
1:标准输出 STDOUT_FILENO
2:标准错误 STDERR_FILENO
(一个进程默认打开三个文件,分别是上面这三个,为了提高可读性,应该使用后面的形式)

open
int open(const char *pathname, int flags, mode_t mode);
参数:
pathname:打开或创建文件的名字

flag:

  1. O_RDONLY:只读打开 0
  2. O_WRONLY:只写打开 1
  3. O_RDWR:读写打开 2
  4. O_EXEC:只执行打开
  5. O_APPEND:写词写时追加到文件末尾
  6. O_CREAT:若文件不存在则创建它
  7. O_EXCL:如果同时制定了O_CREAT,而文件已经存在,则出错,可以测试文件是否存在,不存在则创建,使得测试和创建成为原子操作。
    …参考unixP50-51

mode:可变参数,仅当创建文件时才使用

返回值:open函数返回的文件描述符一定是最小的未用的,成功返回文件看描述符,失败返回-1。

另外,openat函数,可以使用相对路径名来打开目录中的文件,而不再只能打开当前工作目录;而且避免两个基于文件的函数调用,第二个系统调用依赖于第一个的结果,因为不是原子操作导致出错。

creat
int creat(const char *pathname, mode_t mode);
等效于int open(const char *pathname, int flags, mode_t mode);但creat不足是以只写的方式打开所创建的文件。

close
int close(int fd);

lseek
文件偏移量:通常是一个非负整数,用以度量从文件开始出计算的字节数;
通常,读写操作都是从文件的当前偏移量开始,并使偏移量增加所读写的字节数;默认情况打开一个文件,除非指定O_ADDEND选项,否则偏移量为0。
而lseek函数显式的为一个打开的文件设置偏移量:
off_t lseek(int fd, off_t offset, int whence);
参数:

whence该文件偏移量
SEEK_SET距文件开始处offset个字节
SEEK_CUR当前值加offset
SEEK_END文件长度加offset

若lssek成功执行,返回新的文件偏移量,失败返回-1.

read
ssize_t read(int fd, void *buf, size_t count);
返回:成功返回读到的字节数,如果已到达文件末尾,返回0;失败返回-1。
write
ssize_t write(int fd, const void *buf, size_t count);
返回:成功返回已经写入的字节数,失败返回-1。
返回值通常与count相同,否则出错。

I/O结构
在这里插入图片描述
如果两个进程打开了同一个文件(进城之间相互独立),那么:
在这里插入图片描述
假设两个进程分别在fd的2和3上打开该文件,那么这两个进程各自获得一个文件表项(因为每个进程都有自己对该文件的偏移量),但只有一个v节点表项。
涉及到原子操作问题,unixP61-63。

dup复制一个现有的文件描述符
int dup(int oldfd);
由dup返回的新文件描述符一定是当前可用文件描述符的最小数值,新文件描述符和旧fd共享文件表项。+

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值