第三章 文件操作

底层文件访问

每个进程都有一些与之相关的文件描述符,这是一些小值整数,可以通过它们访问打开的文件。当程序开始运行时,它一般会有三个已经打开的文件描述符:

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 }

 

posted @ 2016-04-14 00:52  河边的码农  阅读(154)  评论(0编辑  收藏  举报