C语言文件操作-文件IO(系统调用)-文件IO (系统调用)

时间:2024-07-10 07:14:15

文件IO就是系统调用,用户空间进入内核空间的过程就是系统调用。
系统调用没有缓冲机制,效率较低,可移植性也相对较差,实时性高。

文件描述符

文件描述符是使用open函数打开文件时的返回值

对文件的读写操作,就是通过文件描述符来完成的。

文件描述符是一个整数,在一个程序中文件描述符的范围0-1023共计1024个,

使用 uilmit -a 可以查看一个程序中可以打开的文件的个数限制

(open files 后面对应的就是 这个值也可以使用命令 ulimit -n 2048来修改 但一般都是用默认值)

在一个程序启动的过程中,默认就会打开三个描述符(0 1 2),

分别对应标准输入、标准输出、标准错误。

其他文件描述符需要通过open函数来打开文件,并获得文件描述符。

文件描述符依次递增,文件描述符遵循复用原则,文件描述符关闭后,这个符号就空闲了,可以被其他程序使用.

open函数

open函数用来打开文件,并返回文件描述符。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


int open(const char *pathname, int flags, mode_t mode);

参数:

  • pathname:要打开的文件的路径名
  • flags:打开文件的方式,可以是以下值:
    • O_RDONLY:只读方式打开

    • O_WRONLY:只写方式打开

    • O_RDWR:读写方式打开

    • O_CREAT:如果文件不存在,则创建文件

      • 如果指定了这个宏,则第三个参数 mode 必须填
      • 创建文件的权限还得涉及 掩码 umask
      • umask的值 默认为 0002 这个值也可以改的
      • 最终的权限 = (mode & ~umask)
      • 所以 即使给的是 0666 最终的权限也是 0664
    • O_APPEND:在文件尾部追加内容

    • O_TRUNC:如果文件存在,清空

    • O_EXCL:如果文件存在,则返回错误,错误码:EEXIST

  • mode:文件权限,一般八进制表示;

返回值:

  • 成功:返回文件描述符
  • 失败:返回-1,并设置errno

read函数

read函数用来从文件中读取内容。

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

参数:

  • fd:文件描述符
  • buf:读取到的数据存放的缓冲区
  • count:要读取的字节数

返回值:

  • 成功:返回实际读取的字节数
  • 失败:返回-1,并设置errno

write函数

write函数用来向文件中写入内容。

函数原型:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count); 

参数:

  • fd:文件描述符
  • buf:要写入的数据存放的缓冲区
  • count:要写入的字节数

返回值:

  • 成功:返回实际写入的字节数
  • 失败:返回-1,并设置errno

lseek函数

lseek函数用来移动文件读写指针的位置。

#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

参数:

  • fd:文件描述符
  • offset:相对于 whence 的偏移量
  • whence:
    • SEEK_SET:相对于文件开始位置
    • SEEK_CUR:相对于当前位置
    • SEEK_END:相对于文件结束位置

返回值:

  • 成功:返回新的文件位置
  • 失败:返回-1,并设置errno

close函数

close函数用来关闭文件。

#include <unistd.h>

int close(int fd);

参数:

  • fd:文件描述符

返回值:

  • 成功:返回0
  • 失败:返回-1,并设置errno

dup函数

dup函数用来复制文件描述符。

#include <unistd.h>


int dup(int oldfd);

参数:

  • oldfd:被复制的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno

dup2函数

dup2函数用来复制文件描述符并修改文件描述符。

#include <unistd.h>

int dup2(int oldfd, int newfd);

参数:

  • oldfd:被复制的文件描述符
  • newfd:新的文件描述符

返回值:

  • 成功:返回新的文件描述符
  • 失败:返回-1,并设置errno
  • 注意:如果newfd已经打开,则先关闭它。