第三章 文件操作
底层文件访问
每个进程都有一些与之相关的文件描述符,这是一些小值整数,可以通过它们访问打开的文件。当程序开始运行时,它一般会有三个已经打开的文件描述符:
0:标准输入
1:标准输出
2:标准错误
(1)write系统调用
原型:
#include <unistd.h>
size_t wirte(int fildes, const void *buf, size_t nbytes);
作用:
把缓冲区buf的前nbytes个字节写入与文件描述符fildes关联的文件中,它返回实际写入的字节数。如果返回0,表示未写入任何数据;-1,表示write调用出现了错误,对应的错误代码保存在errno中。
(2)read系统调用
原型:
#include <unistd.h>
size_t read(int fildes, void *buf, size_t nbytes);
作用:
从与文件描述符fildes相关联的文件中读出nbytes个字节,并写到buf缓冲区中,它返回实际读入的字节数。如果返回0,表示未读入任何数据;-1,表示read调用出现了错误,对应的错误代码保存在errno中。
(3)open系统调用
原型:
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
int open (const char *path, int oflags);
int open (const char *path, int oflags, mode_t mode);
作用:
open建立了一条到文件或设备的访问路径。如果操作成功,将返回一个文件描述符,其他系统调用可以通过这个文件描述符对文件进行操作。这个文件描述符是唯一的,不会与其他进程共享。如果两个进程同时打开同一个文件,会得到两个不同的文件描述符。如果它们都对文件进行写操作,它们会各写各的,分别接着上次离开的位置往下写,但是写入的数据不会交织在一起,而是彼此覆盖。两个进程对文件的读写位置有各自的理解。
参数:准备打开的文件的名字作为参数path传递给open,oflags用来定义打开文件所采取的动作。
oflags必须包含的参数:
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
除了这三个之外,还有其他可选参数的组合。
open还可以创建文件,并通过umask系统变量和mode参数设置被创建文件的权限。
(4)close系统调用
原型:
#include <unistd.h>
int close(int fildes)
作用:
使用close可以终止一个文件描述符fildes与其对应文件之间的关联。文件描述符被释放并且能够重新使用。关闭成功返回0;,出错返回 -1 。
实例:
1 #include <unistd.h> 2 #include <fcntl.h> 3 #include <stdlib.h> 4 5 int main() 6 { 7 char block[1024]; 8 int in, out, nread; 9 10 in = open("inputdata", O_RDONLY); 11 out = open("outputdata", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); 12 13 while((nread = read(in, block, sizeof(block))) > 0) 14 { 15 write(out, block, nread); 16 } 17 exit(0); 18 }