通过系统调用进行文件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。

最后修改: 2025年01月27日 星期一 23:52