C语言入门小册子
通过系统调用进行文件I/O操作比调用C文件I/O库更简单,并且工作在更低的级别。基本上,有七个文件I/O系统调用:
-
creat()
:创建一个文件用于读取或写入。 -
open()
:打开一个文件用于读取或写入。 -
close()
:在读取或写入后关闭文件。 -
unlink()
:删除文件。 -
write()
:向文件写入字节。 -
read()
:从文件读取字节。
这些调用是为UNIX操作系统设计的,不是ANSI C标准的一部分。
使用这些系统调用需要包含头文件fcntl.h
:
#include <fcntl.h>
creat()
系统调用
creat()
系统调用用于创建一个文件。其语法如下:
<file descriptor variable> = creat(<filename>, <protection bits>);
这个系统调用返回一个整数,称为“文件描述符”,它是一个标识creat()
生成的文件的数字。其他系统调用将在程序中使用这个数字来访问该文件。如果creat()
调用遇到错误,它将返回文件描述符-1
。
filename
参数给出了新文件的文件名,protection
bits
指定文件的“访问权限”。一个文件有三种“权限”:
- 写权限:允许向文件写入数据。
- 读权限:允许从文件读取数据。
- 执行权限:指明该文件是一个可执行的程序。
这些权限可以设置为三个不同级别:
- 用户级别:权限适用于单个用户。
- 组级别:权限适用于用户定义的“组”成员。
- 系统级别:权限适用于系统中的所有人。
对于creat()
系统调用,权限是以八进制表示的,每个级别的三个权限位用一个八进制数字表示。举例如下:
0644
:为用户提供读写权限,但仅为组和系统提供读权限。0777
:为每个人提供所有权限。
如果尝试creat()
一个已存在的文件(且程序具有写权限),不会返回错误。相反,它将清空文件内容并返回该文件的文件描述符。
例如,要创建一个名为“data”的文件,并为系统中的每个人提供读写权限,可以使用以下语句:
#define RD_WR 0666
...
int fd; /* 定义文件描述符。 */
fd = creat("data", RD_WR);
open()
系统调用
open()
系统调用用于打开一个已有的文件进行读取或写入。其语法如下:
<file descriptor variable> = open(<filename>, <access mode>);
open()
调用与creat()
类似,都返回文件描述符。如果发生错误,它将返回-1
。然而,open()
的第二个参数是“访问模式”,而不是权限代码。常见的访问模式(在fcntl.h
头文件中定义)有:
O_RDONLY
:只读模式打开。O_WRONLY
:只写模式打开。O_RDWR
:读写模式打开。
例如,假设文件“data”已经被另一个程序创建,可以用以下语句打开该文件进行写操作:
int fd;
fd = open("data", O_WRONLY);
几点额外说明:
creat()
调用隐含了open()
,因此无需先使用creat()
创建文件,再使用open()
打开。- 操作系统对一个程序在任意时刻能够打开的文件数有一定的限制。
- 文件描述符只是一个程序用来区分不同打开文件的任意数字。当文件关闭后,再次打开该文件通常不会得到相同的文件描述符。
close()
系统调用
close()
系统调用非常简单。它的作用是关闭一个已经打开的文件,当不再需要访问该文件时使用。其语法如下:
close(<file descriptor>);
close()
调用成功时返回0,遇到错误时返回-1。
unlink()
系统调用
unlink()
系统调用用于删除文件。其语法如下:
unlink(<file_name_string>);
unlink()
调用成功时返回0,失败时返回-1。注意:即使在调用unlink()
后,你仍然可以使用文件描述符进行读取或写入。
write()
系统调用
write()
系统调用用于向一个打开的文件写入数据。其语法如下:
write(<file descriptor>, <buffer>, <buffer length>);
文件描述符是由creat()
或open()
系统调用返回的。buffer
是指向包含数据的变量或数组的指针,buffer
length
指定要写入文件的字节数。
虽然不同数据类型在不同系统上可能有不同的字节长度,但可以使用sizeof()
语句提供正确的缓冲区长度(以字节为单位)。例如,write()
调用可以这样指定:
float array[10];
...
write(fd, array, sizeof(array));
write()
函数返回它实际写入的字节数。如果发生错误,它将返回-1。
read()
系统调用
read()
系统调用用于从一个打开的文件读取数据。它的语法与write()
调用完全相同:
read(<file descriptor>, <buffer>, <buffer length>);
read()
函数返回它实际读取的字节数。如果到达文件末尾,它将返回0;如果发生错误,它将返回-1。