一般来说,文件I/O的系统调用分为:open()
, read()
, write()
,close()
。这篇博客就在讨论下这四个基本系统调用的使用。
需要的头文件:
|
|
open()
open()
系统调用用来打开一个文件,其既能打开一个已有文件又能创建并打开一个新文件。
其的语法如下:
|
|
这里的参数中 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()
系统调用用来读取从文件描述符中所打开文件的数据
其语法如下:
|
|
函数的参数中 int fd
是文件描述符。void buf
提供内存地址,也就是个指针,比如可以用&c
。size_t count
指定最多能读取的字节数。
需要 count
大概是因为防止内存溢出吧,buf
至少需要 count
个字节。
如果 open()
调用成功就会返回读取的字节数,如果遇到文件结束就返回 0,而错误返回 -1 。
下面是一个例子:
|
|
write()
write()
系统调用将数据写入一个已打开的文件
其的语法为:
|
|
write()
的参数和 open()
很类似,其中的 int fd
是文件描述符,const void buf
是要写入数据的内存地址,size_t count
是要写入文件的数据字节。
其的返回也和 open()
类似,如果调用成功返回写入的字节数。
close()
close()
系统调用用来关闭一个