Unix文件操作
一. open和openat的区别
函数原型:
int open(const char *path, int oflag, .....);
int openat(int fd, const char *path, int oflag, ..............);
两者区别
openat参数 fd 可指定相对路径来打开文件
openat有利于解决TOCTTOU问题
二. lseek函数可生成文件空洞
即lseek函数的指针大于文件长度时,将会生成 0/ 填充的文件。
三. fcntl函数改变已打开文件属性
函数原型:
int fcntl(int *fd*, int *cmd*, .../ * int arg * /);
fd 为文件描述符,表进程中的文件描述标志
cmd 对打开文件执行的命令
arg 和参数cmd有关,详见《UNIX高级环境编程》P65-66
注:Unix中命令行使用 ’ > ’ 表输出到文件;使用 ’ < ’ 表输入文件代替标准输入。
习题总结
- 关于软件缓冲和硬件缓存的区别
软件缓冲是指用队列或者其他数据结构实现对数据的暂时存储,以实现收发端的一致。而硬件缓存是为解决不同硬件速度不匹配问题而使用的硬件功能。 - fcntl在dup2函数中的应用
dup2函数的实现方式(两步):
close(fd2) //关闭fd2文件
fcntl(fd, F_DUPFD, fd2) //复制fd描述符至fd2,fcntl涉及的描述符的位置要**大于等于**fd2的值。
“大于等于”,是因为fd2可能已经被使用,此时只能找更大的描述符。
参考资料:
[1]. UNIX高级环境编程课后习题