我是靠谱客的博主 缓慢白猫,最近开发中收集的这篇文章主要介绍《Unix环境高级编程》---系统调用IO,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.简介

Linux系统中的大多数文件I/O只需用到5个函数:openreadwritelseek以及close

文件I/O是不带缓冲的I/O,它不是ISO C的组成部分。

2.文件描述符

对于内核而言,所有打开的文件都通过文件描述符引用。

文件描述符是一个非负整数

文件描述符012分别关联进程的标准输入标准输出标准错误

在头文件<unistd.h>中,标准输入、标准输出和标准错误分别定义为常量STDIN_FILENOSTDOUT_FILENOSTDERR_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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部