Linux开发之文件IO

发布时间 2023-04-16 23:40:08作者: 1v7w

文件IO

C语言中有文件IO相关的库函数(fopen等),他的实际上是经过了某些步骤,然后调用linux系统调用。

这篇文章,要讲的是linux系统调用的文件IO,如open,close,read等。

预备知识

文件描述符

在linux中,程序打开的文件,会有一个整数指向它,这就叫文件描述符。通过对文件描述符进行操作,就能实际操作到打开的文件上。

文件描述符默认从3开始分配,因为0,1,2已经被占用,分别是标准输入,标准输出以及标准错误,这3个都指向当前终端。每打开一个新的文件,都会分配最小的未使用的文件描述符(系统做这个工作)。

man

linux的官方文档就是man手册,在学习系统调用时候查阅man手册很重要。系统函数在man的第2卷,比如想要查阅open系统函数可以输入man 2 open

open函数文档

perror()

打印errno所代表的错误信息。

// 所需头文件(之后将不再解释
#include <stdio.h>

void perror(const char *s);

s是展示给用户的字符串。

IO system call

open()

open函数用来打开文件。

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

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname:的是文件路径。
  • flags:打开方式。必须包含这三个之一(O_RDONLY, O_WRONLY, or O_RDWR)。还有一些可选的,可以用按位或来选中。可选项如下:
    • O_APPEND:使用追加模式打开文件。
    • O_CREAT:如果文件不存在将创建文件。
  • mode:创建文件的权限,八进制形式(如0777)。不过文件最终权限=mode&~umask。(通过命令umask来查看)。

返回值是文件描述符(>0),如果文件打开失败,将返回-1,并设置errno。

read()

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

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • fd:要读取的文件的文件描述符。
  • buf:要把读取到的数据存到哪里
  • count:读取的大小

返回值是实际读取到的大小,如果>0表示读取正常,如果=0表示读完文件了,如果=-1表示读取错误,并设置errno。

write()

write函数用来在文件中写入数据。

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • fd:要写入的文件的文件描述符。
  • buf:要写入的数据的地址
  • count:写入的大小

返回值是实际读写入的大小,如果=-1表示写入错误,并设置errno。