unix环境高级编程之一( 基本I/O函数)
1.open 函数
调要open函数可以打开或创建一个文件。
格式:
#include <fcnt1.h>
int open(const char *pathname,int oflag,---);
注释: pathname是需要打开的文件;
oflag参数用来说明此函数的多个选项。用 O_RDONLY(只读),O_WRONLY(只写),O_REWR(读写)(这三个常量有且只能指定一个)和其余的多个常量进行或运算构成:
O_APPEND 每次写时都追加到文件的尾端
O_CREAT 若文件不存在则创建它,需要第三个参数为指定文件的访问权限
O_EXCL 若同时指定O_CREAT,而文件存在则会出错,用此则可以测试文件是否存在,若不存在则创建这个文件
O_TRUNC 如果此文件不存在,而且为只写或读写成功打开,则将其长度截短为0
O_NOCTTY 若pathname指的是终端设备,则不将该设备分配为此进程的控制端
O_NONBLOCK 非阻塞模式
-----是根据第二个参数进行操作的
2.create函数
#include <fcnt1.h>
int create(const char *pathname,mode_t mode);
相当于 open(pathname,O_WRONLY | O_CREAT | O_TRUNC,mode);
3.close函数
#include<fcnt1.h>
int close (int filedes); 返回值若成功返回0不成功返回-1
4.lseek函数
可以用lseek显式地为一个打开的文件设置其偏移量。
#include<unistd.h>
off_t lseek(int fileds,off_t offset,int whence);
whence是SEEK_SET,则将该文件的偏移量设置为距文件开始出offset个字节
whence是SEEK_CUR,--------------------- 当前值加offset,offset可正可负
whence是SEEK_END -----------------------文件长度加offset-----------
off_t currpos;
currpos = lseek(fd.0,SEEK_CUR);
返回值:若成功则返回新的文件偏移量,若出错则返回-1
每个打开的文件都有一个与其相关联的“当前文件偏移量”。它通常是一个非负整数,用以度量从文件开始处计算的字节数。
5.read函数
从打开的文件中读数据到buf
#include <unistd.h>
ssize_t read(int filedes,void *buf,size_t nbytes);
返回值:若成功则返回读到的字节数,若已到文件结尾则返回0,若出错返回-1
6.write函数
#include <unistd.h>
ssize_t write(int filedes,const void *buf,size_t nbytes);
返回值:若成功则返回字节数,若出错返回-1
7.pread,pwrite函数:
主要用于解决文件共享问题:
#include<unistd.h>
ssize_t pread(int filedes,void *buf,size_t nbytes,off_t offset);
返回值:读到的字节数,若已到文件结尾则返回0,若出错则返回-1
ssize_t pwrite(int filedes,const void *buf,size_t nbytes,off_t offset);
返回值:若成功则返回已写的字节数,若出错则返回-1
调用pread相当于顺序执行lseek和read,
调用pwrite相当于顺序执行lseek和write,
8.dup和dup2函数
这两个函数都用来复制一个现存的文件描述符
#include <unistd.h>
int dup(int filedes);
int dup2(int filedes,int filedes2); filedes2参数指定新描述符的数值。如果filedes2已经打开,则先关闭。
返回值:若成功返回新的文件描述符,若出错则返回-1
9.sync,fsync ,fdatasync函数:
为了解决延迟写的问题,保证磁盘上实际文件系统和缓冲区高速缓存中内容的一致性。
#include <unistd.h>
int fsync(int filedes); 只对由文件描述符filedes指定的单一文件其作用,并且等待写磁盘操作结束
int fdatesync(int filedes); 功能和fsync差不多,但它还同步更新文件的属性
void sync(void); 将所有修改过的快缓冲区排入写队列,然后返回,它并不等待实际写磁盘操作结束
10.fcnt1函数
可以改变已打开的文件性质
#include <fcnt1>
int fcnt1(int filedes,int cmd,---);
具体的请查看资料
11.ioct1函数
其他函数都无法完成的操作,
int ioct1(int filedes ,int request,----);