文件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