Featured image of post Linux系统调用笔记-简单的文件I/O处理

Linux系统调用笔记-简单的文件I/O处理

一般来说,文件I/O的系统调用分为:open(), read(), write(),close()。这篇博客就在讨论下这四个基本系统调用的使用。

需要的头文件:

1
2
#include <unistd.h>
#include <fcntl.h>

open()

open() 系统调用用来打开一个文件,其既能打开一个已有文件又能创建并打开一个新文件。
其的语法如下:

1
2
 int open(const char *pathname, int flags, ...
                           /* mode_t mode */ );

这里的参数中 char *pathname 是文件名,int flags 是位掩码,用于指定文件的访问模式。常见的有以下几种:

位掩码 描述
O_RDONLY 以只读方式打开文件
O_WRONLY 以只写方式打开文件
O_RDWR 以读写方式打开文件
O_CREAT 若文件不存在则创建

open()会返回一个文件描述符,通常用 int fd 存储。
int fd 返回的文件描述符是进程未使用的文件描述符的正整数最小值,一般从 3 开始,因为 0、1、2都已经被占用了。
如果打开文件发生错误,open()会返回-1,错误号errno标识错误原因

read()

read() 系统调用用来读取从文件描述符中所打开文件的数据
其语法如下:

1
ssize_t read(int fd, void buf[.count], size_t count);

函数的参数中 int fd 是文件描述符。void buf 提供内存地址,也就是个指针,比如可以用&csize_t count 指定最多能读取的字节数。
需要 count 大概是因为防止内存溢出吧,buf 至少需要 count 个字节。

如果 open() 调用成功就会返回读取的字节数,如果遇到文件结束就返回 0,而错误返回 -1 。 下面是一个例子:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main (int argc, char* argv[]){
	int fd;
	ssize_t numRead;
	char fi[255];
	fd = open("./foo", O_RDWR | O_CREAT, 0644);
	if (fd < 0)
		perror("open");

	numRead = read(fd, &fi, sizeof(fi));
	if (numRead < 0)
		perror("read");
	
	for (int i = 0;i<numRead;i++)
		printf("%c", fi[i]);

	return 0;
}

write()

write()系统调用将数据写入一个已打开的文件
其的语法为:

1
ssize_t write(int fd, const void buf[.count], size_t count);

write()的参数和 open()很类似,其中的 int fd 是文件描述符,const void buf 是要写入数据的内存地址,size_t count 是要写入文件的数据字节。
其的返回也和 open()类似,如果调用成功返回写入的字节数。

close()

close() 系统调用用来关闭一个

萌ICP备20241614号