软件实现——第二组

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文件I/O 操作(unbuffered I/O)

不带缓存的函数如read和write 都调用内核中的一个系统调用。

在涉及多个进程以及他们之间的资源共享时,将介绍院子操作的概念,并将说明dup、fcntl和icotl 函数

对于内核而言,所有打开的文件都是由一个非负整数描述,称为文件描述符。

open

 

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
open(const char * name,int oflag[optional parameter],[mode]);

 name 是要打开或创建的文件名;

oflag 为O_RDONLY 只读打开;

oflag 为O_WRONLY 只写打开;

oflag 为O_RDWR读写打开;

可选参数:

O_APPEND 每次都添加到文件尾部;

O_TRUNC 只读或只写打开文件,写入前删除原有数据;

O_CREAT 文件不存在则创建(需要第三个参数mode来说明存取许可位);

O_EXCL 如果文件已经存在而又制定了O_CREAT 则报错

O_NOCTTY 如果打开的文件为系统终端,则终端不可以做为正在操作open 的控制终端

mode是文件的访问许可权位 略

create

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int create(const char *name,mode_t mode);

 name 是文件名 mode 是创建文件时的存取许可位

这个函数可以用open函数来等效,他只能以只写方式打开文件 等于open(name,O_WRONLY|O_TRUNC,mode);

返回值:失败返回-1,成功返回文件描述符

close

此函数为打开一个已经打开的文件

格式

#include <unistd.h>
int close(int file);

 file 是已经打开的文件描述符。

返回值:成功返回0,否则返回-1

lseek

此函数为指定一个当前文件位移量,这个位移量是一个非负整数,用来说明从文件开始处计算的字节数

#include <unistd.h>
#include <sys/types.h>
off_t lseek(int file,off_t offset,int whence);

 file是需要指定位移量的文件描述符;

offset是位移量大小,是任意整数;

whence 是SEEK_SET,则将位移量设置在距文件开始offset字节的位置;

whence是SEEK_CUR,则将位移量设置在距当前值加offset字节的位置;

whence是SEEK_END,则将位移量设置为文件长度加offset字节的位置;

返回值:成功返回文件位移,出错返回-1。

read
次函数为从文件中读入数据。

#include <unistd.h>
size_t read(inf file,void *buff,size_t,bytes);

 file是目标文件的文件描述符;

buff是输入输出缓冲区,指针指向要读入的缓冲区;

bytes是每次读取的数据量。

返回读到的字节数,若已到尾部则返回0,若出错返回-1;

write

此函数位向文件中写入数据

#include <unistd.h>
size_t write(int file,vod *buff,size_t bytes);

 file 是目标文件的文件描述符

buff是I/O缓冲区,指针指向要写入的缓冲区;

bytes 是每次写入的字节数;

返回写入文件的字节总数,大小一定小于缓冲区容量,出错返回-1;

dup

此函数可以用来复制一个现存的文件描述符

#include <unistd.h>
int dup(int oldfile);
int dup2(int oldfile,int newfile);

 oldfile是旧的文件描述符;

newfile是新的文件描述符;

dup2可以指定新的文件描述符;

如果操作成功则返回新的文件描述符;失败返回-1;

fcntl

fcntl 用途1:复制描述符(cmd=F_DUPFD).

fcntl 用途2:获取/设置文件描述符标志(cmd=F_GETFD or F_SETFD).唯一标志FD_CLOEXEC.

fcntl 用途3:获取/设置文件状态表之(cmd=F_GETFL or F_SETFL).只能修改:O_APPEND、O_NONBLOCK和O_ASYNC.

fcntl 用途4: 获取/设置记录锁(cmd=F_GETLK,F_SETLK or F_SETLKW).

fcntl 用途5获取/设置异步I/O(cmd=F_GETOWN,F_SETOWN,F_GETSIG* or F_SETSIG*).

#include <unistd.h>
#include <fcntl.h>
int fcntl (int fd,int cmd);
int fcntl(int fd,int cmd,long arg)'
int fcntl(int fd,int cmd,struct flock *lock);

 fd 是当前文件的描述符

arg是一个整数,用于和cmd的配合使用

*lock 是一个指向结构体的指针,用于和cmd的记录锁功能配合;

cmd 是一个指令,用它来实现不同的功能调用,cmd为:

F_DUPFD 复制现存的描述符到arg,功能同dup2,成功返回新的文件描述符,错误返回-1;

F_GETFD 获得文件描述符标记,成功则返回该描述符标记,错误返回-1;

F_SETFD 设置文件描述符标记为arg指定的值,成功返回值,错误返回-1;

F_GETFL 读取并返回已打开文件的状态标志,错误返回-1;

F_SETFL 设置文件状态标志位arg的值,可以更改的几个标志是O_APPEND,O_NONBLOCK,O_ASYNC,成功返回相应的标志,错误返回-1。

F_GETLK,F_SETLK,F_SETLKW为获得/设置记录锁。

ioctl 此函数是input/output control的缩写,即输入输出控制。他可以通过一个文件描述符来控制字符设备。由于linux 将设备文件等特殊文件和一般文件平均对待,那么要对特殊文件作一些特殊操作既要用到ioctl参数。通常ioctl的最大使用方面是终端I/O。

#include <sys/ioctl.h>
int ioctl (int file,int request,char *argp|struct termios st);

 file 是一个已经打开的文件的描述符;

request 是一个编码代表的命令类型;

argp是该命令的参数,termios 是一个在termios.h中定义的结构体,其中的参数可以告诉设备驱动程序如何处理出入输出的数据。

返回值

成功返回0 出错返回-1

posted on 2012-04-08 23:55  软件实现——第二组  阅读(190)  评论(0编辑  收藏  举报