Llinux 文件

文件是由创建者所定义的一组相关的信息集合。

文件的访问方式:顺序访问和直接(随机)访问。

1、顺序访问:程序依次访问文件的数据,操作系统自动记录文件访问的当前位置。

2、直接(随机)访问:程序读/写时直接给出要访问数据的逻辑位置(如第几个字节或第几个记录)及长度,由OS将逻辑位置转换成物理位置并访问之。

OS观点:文件包含文件控制块(FCB)和文件体。

文件控制块(FCB)的主要内容:

文件名

创建者

文件物理位置信息:如检索表

创建、修改时间、保存时间

口令:用于对文件访问进行验证

操作限制:如读、写、执行权限说明

文件标识符:文件标识符是非负整数。打开现存文件或新建文件时,内核会返回一个文件标识符。读写文件也需要使用文件标识符来指定待读写的文件。

标准输入(standard input)的文件标识符是 0

标准输出(standard output)的文件标识符是 1

标准错误(standard error)的文件标识符是 2

POSIX 定义了 STDIN_FILENO、STDOUT_FILENO 和 STDERR_FILENO 来代替 0、1、2。这三个符号常量的定义位于头文件 unistd.h。

文件标识符的有效范围是 0 到 OPEN_MAX。

open()/close()方法和read()/write()方法

#include <sys/types.h>
#include <sys/stat.h>
#include <fcnt.h>

int open (const char *pathname, int oflag, .../*,mode_t  mode */);
           Return: file descriptor if OK,-1 on error.


#include <unistd.h>

int close(int filedes);
           Return: 0 if OK,-1 on error.
#include <unistd.h>

ssize_t read(int filedes, void *buff, size_t nbytes);

      Return: number of bytes read,0 if end of file,-1 on error.

ssize_t write(int filedes, const void *buff, size_t nbytes);

      Return: number of bytes written if OK,-1 on error.

  

pathname是要打开或创建的文件的名字。如果整个路径名超过PATH_MAX,或路径名中的任一文件名超过NAME_MAX时,返回出错ENAMETOOLONG。

用下列一个或多个常数进行或运算构成oflag参数(这些常数定义在<fcntl.h>头文件中):

O_RDONLY 只读打开

O_WRONLY 只写打开

O_RDWR 读、写打开

O_APPEND 每次写时都加到文件的尾端

O_CREAT 若此文件不存在则创建它

O_EXCL 如果同时指定了O_CREAT,而文件已经存在,则出错。这可测试一个文件是否存在,如果不存在则创建此文件成为一个原子操作

O_TRUNC 如果此文件存在,而且为只读或只写成功打开,则将其长度截短为0

O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式

O_SYNC 使每次write都等到物理I/O操作完成

由open返回的文件标识符一定是最小的未用标识符数字。这一点被很多应用程序用来在标准输入、标准输出或标准出错输出上打开一个新的文件。

例如:

在Linux操作终端下,写一段代码完场下列功能。

在当前目录下存在文件“test1”。

将“test1”的内容复制到“test2”;

操作完成后,将文件关闭。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#define  buffsize  1024
int main()
{
    int fh1,fh2;
    int bytes_read;
    char buff [buffsize];
    fd1 = open( "testfile01" , O_RDONLY );
    fd2 = open( "testfile02" , O_WRONLY | O_CREAT , 0644 );
    printf ("fh1 = %d , fh2 = %d\n",fh1,fh2);
 
    while( bytes_read = read(fh1 , buff , buffsize))
    {
      write(fh2 , buff , bytes_read);  
    }
    close( fh1 );
    close( fh2 );
}

  

posted @ 2012-03-13 23:35  龍傲霜  阅读(178)  评论(0编辑  收藏  举报