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。