Unix环境高级编程读书笔记(1)

来源:互联网 发布:spss软件中文版 编辑:程序博客网 时间:2024/05/17 03:41
1、查看当前session中fd数量限制
ulimit -n
修改当前session中fd数量的限制
ulimit -n 数量


2、off_t lseek(int fd,off_t offset,int whence);
返回值:当前文件偏移量


whence:SEEK_SET//相对于文件起始处 SEEK_CUR//相对于文件当前位置SEEK_END//相对于文件末尾


获取当前偏移量的方法:off_t res = lseek(fd,0,SEEK_CUR);
当操作的文件为:pipe、FIFO、socket时,返回-1并设置错误为ESPIPE
空洞:文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成一个空洞,位于文件中但没有
写过的字节都被读为0;文件中的空洞不要求在磁盘上占用存储区,当定位到超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是
对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。


3、close-on-exec
当使用fork创建子进程后,子进程获得父进程的地址空间,堆、栈的副本,共享打开的文件标记、文件偏移量等,当在子进程中调用exec执行
另一个程序,就替换了当前进程的地址空间、堆、栈,原先子进程中的文件描述符丢失了(并未关闭),无法再关闭这些在子进程中不再使用的
文件描述符,而文件描述符是系统珍贵资源、数量有限,有个FD_CLOEXEC标志,可以通过fcntl函数实现,也可以在创建或者打开文件的时
候用:O_CLOEXEC


4、使得打开文件并在文件尾追加内容,最好用O_APPEND,其使得打开文件以及定位在文件尾部成为一个原子操作;如果用open、lseek其不为
原子操作


5、O_CREAT和O_EXCL合用,可用来判断一个文件是否已存在,如果已存在,则会出错返回,若不存在,则创建此文件


6、creat是以只写的方式打开所创建的文件,如果要读文件,必须先close,然后open


7、对一个文件指定位置进行写入或者读取,有两个步骤:
1)调用lseek,设置偏移量
2)调用read或者write操作
两步操作可用pread、pwrite可以把上述两个步骤合并为一个原子操作;
使用pread、pwrite并不会改变当前文件偏移量;
ssize_t pread(int fd,void *buf,size_t count,off_t offset);
ssize_t pwrite(int fd,const void *buf,size_t count,off_t offset);
当打开文件时指定了参数O_APPEND时,pwrite总是添加到文件末尾,而不会按照参数offset指定位置


8、int dup(int oldfd);//返回最小的未被使用的文件描述符
int dup2(int oldfd,int newfd);//将返回一个指定的文件描述符。如果oldfd指定了close-on-exec,newfd并不会拥有,需要使用fcntl指定;
如果newfd已经存在,则会先被关闭;如果oldfd和newfd数值相同,且oldfd是有效的文件描述符,则dup2不做任何事情,返回newfd;如果
newfd和oldfd相同,且oldfd时无效的文件描述符,则调用失败,不会调用newfd关闭的步骤
int dup3(int oldfd,int newfd,int flags);
效果和dup2相同,当可以通过flags为O_CLOEXEC,使得newfd具有close-on-exec功能;
如果oldfd和newfd数值相同,则调用失败,并设置错误为INVAL。


9、fcntl函数可以改变已经打开文件的属性
int fcntl(int fd,int cmd,.../*int arg*/);
fcntl函数有以下五种功能
1、复制一个已有的描述符cmd=F_DUPFD或F_DUPFD_CLOEXEC
2、获取/设置文件描述符标志cmd=F_GETFD或F_SETFD(文件描述符标志当前只知道FD_CLOEXEC)
3、获取/设置文件状态标志cmd=F_GETFL或F_SETFL
4、获取/设置异步I/O所有权cmd=F_GETOWN或F_SETOWN
0 0
原创粉丝点击