unix - 文件I/O

  • 在unix系统中, 通常write只是将数据排入队列,而实际的写磁盘操作则可能在之后的某个时刻。而数据库系统则需要使用O_SYNC,write直至数据写到磁盘上再返回。这样,当它从write返回时就知道数据已经确实写到磁盘

  • 函数dup 和 dup2

dup 和dup2都可以用来复制一个现有的文件描述符

#include <unistd.h>
int dup(int fd);
int dup(int fd, int fd2);

由dup返回的新文件描述符一定是当前可用文件描述符中的最小值。
对于dup2,可以用fd2来制定新的描述符的值。如果fd2已经打开,则先将其关闭。 如果fd等于fd2,则dup2返回, 而不关闭它。
这些函数返回的新文件描述符与参数fd共享同一个文件表项。

newfd = dup(0)
此时假设下一个可用的描述符是3. (0,1,2都由shell打开)

调用dup(fd) 等效于 fcntl(fd, F_DUPFD, 0);
调用dup2(fd, fd2), 等效于
close(fd2);
fcntl(fd, F_DUPFD, fd2);

而dup2又不完全等效于 close 加上fcntl. dup2是原子操作

posted @ 2021-10-05 11:05  feiwatson  阅读(27)  评论(0编辑  收藏  举报