1:I/o操作函数
每一个进程在启动的时候会打开三个文件,分别是stdout,stdin,stderr,他们的文件描述符号分别是0,1,2 open,read,write,close函数是文件操作函数unix中的低级调用,他们使用文件描述符作为借口
open函数,打开文件#include <sys/types.h>
#include <sys/stat.h>
#include <fcnt1.h>
int open(const char *pathname,int flags);返回值是一个整数类型,表示一个文件的描述符
其中flags能使用的标志如下:1:O_RDONLY,以至读的方式打开
2:O_WRONLY 以只写的方式打开
3:O_RDWR 以读写的方式打开
其中还有很多和flag相组合的一些方式,中间用OR连接,可以上网查一查
2:close函数,关闭文件,当使用万文件后,则要使用close()关闭该文件,close()会让数据写回磁盘,并且释放该文件所占用的资源
#include <unistd.h>
int close (int fd);
调用此函数发生错误的情况——fd是一个无效的描述符————再调用该函数的时候收到中断信号————文件i。o放生错误
3:read函数,此函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中,若参数count为0则read不会起作用并且返回0,文件会随读取到的字节而移动,read函数的原型为
#include <unistd.h>
ssize_t read (int fd,void *buf,size_t count);其中fd表示用open,creat所返回的一个文件描述符
此函数的返回值是所读取的字节数,如果是0就表示到达文件末尾或者是没有文件可读,如果发生错误时就返回-1,错误代码存入errno中,而文件读写位置无法预期,可以吧返回值和count比较,如果字节少了,则有可能出现读到文件尾,从管道pipe或终端机读取或者read被信号中毒了读取动作
4:write 函数,写文件,会把以参数buf为起始的内存中的count个字节写入到参数fd所指的文件中,文件读写位置会随之移动
#include <unistd.h>
ssize_t write (int fd ,const void *buf.size_t count);
函数返回值,如果成功,函数会返回实际写入字节数,党有错误反生时候则返回-1,错误代码存入errno中,对于一个普通文件返回0没有影响
5:iseek函数,文件定位
#include <sys/types.h>
#inlcude <unistd.h>
off_t lseek (int fildes,off_t offset.int whence)
其中,filds表示已经打开的文件描述符,第一个为根据whence参数来移动偏移量。第三个参数有SEEK_SET ,SEEK_CUR,SEEK_END,当调用成功的时候返回当前文件读写的位置,也就是说会返回距离文件开头有多少个字节
6:ioctl函数,文件控制
#include <sys/ioctl.h>
int ioctl (int fd,usigned int cmd,...)
这是一个对设备文件进行操作的特殊函数,对于普通文件不使用这个函数,该函数的调用回合驱动程序内部相应的函数对应,cm d参数是一个命令参数,。。。号是自定义的命令参数,如果成功就返回0,不成功就返回-1
7:flock函数,文件锁定函数
#include<.sys/file.h>
int flock (int fd,int operation)
flock函数会依参数operation所指定的方式对参数文件所制定的文件做各种锁定或是接触锁定的动作,此函数只能锁定整个文件,无法锁定文件的哪个区域,单一文件无法同时建立共享锁定,当使用dup或是fork时,文件描述符也不会继承此种锁定,
关于operation的参数
LOCK_SH:建立共享锁定,多个进程可同时对一个文件做共享锁定
LOCK_EX:建立互斥锁定,一个文件同时只有一个互斥锁定
LOCK_UN:接触锁定
LOCK_NB无法建立锁定时,此操作可不被阻断,立刻返回进程,通常与LOCK_SH,LOCK_EX 做or(1)组合
8:mmap函数和munmap函数,内存映射分别用于建立和及诶出内存映射
#include <unistd>
#include <sys/mman.h>
void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize)
void munmap(void *start ,size_t length)
mmap用来将某个文件类容映射到内存中,对该内存区域的存取即使直接对该文件内容的读写,再调用mmap时必须要制定flags为MAP_SHAREN或是MAP_PRINVATE
start致命对应的内存其实地址,通常是NULL表明系统自动选定地址
length指明了将文件中多大部分对应到内存中
prot:
PROT_EVEC:映射区域可被执行
PROT_READ:影射区域可被读取
PROT_WRITE:影射区域可能写入
PROT_NONE:影射区域不能存取
flags:映射区域的各种特性
MAP_FIED
MAP_SHARED
MAP_PRIVATE
MAP_ANONYMUS
MAP_DENYWRITE
MAP_LOCKED:
offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小的整数倍
9:create函数,创建文件
#include <sys/types.h>
#inlcude <stat.h>
#include <fcntl.h>
int create (const char *pathname,mode_t mode)
create用于创建一个新的文件,这个函数将返回一个文件描述符,若出错,早日返回-1,如果需要新建的文件已经存在,则经过creae函数调用后,该文件的内容会置空
10:dup函数和dup2函数,复制文件描述符
#include <unistd.h>
int dup(int filedes)
int dup2(int filedes,int filedes2)
这两个函数用于复制一个显存额文件描述符,由dup返回的新文件描述符一定是当前可用的文件描述符中最小一个,用dup2则可以用filedes2参数指定新描述符的数值,如果filedes2已经打开,则现将其关闭,如果filedes等于filedes2,则dup2函数返回filedes2
如果执行成功则返回新的描述符,如果失败则返回-1,错误存在于errno中
11:fcntl函数,改变已经打开的文件的属性
#include <fcntl.h>
int fcntl(int fields,int cmd)
int fcntl(int fields,int cmd,int arg)
cmd是输入的命令,arg命令参数
功能是:复制一个现有的描述符,cmd=F_DUPFD————得到/设置文件爱你描述符标记(cmd = F_GETFD/F_SETFD)--------------得到/设置文件状态标计(cmd = F_GETFL / F_SETOWN)----------------------得到/设置异步i/o所有权(cmd=F_GETOWN,cmd-= F_SETOWN)----------------------------得到/设置记录锁(cmd = F_GETLK,F_SETLK 或 F_SETLKW)
如果执行成功则返回新的描述符,如果失败则返回-1,错误原因存在与errno中