fcntl
操作文件描述符<span style="font-size:18px;">#include <unistd.h>
#include <fcntl.h>
Int fcntl(int fd, int cmd, …);</span>
主要的三种用途:
A、 复制文件描述符
F_DUPFD(long),返回新的文件描述符
B、 文件描述符标记位
目前唯一被操作的标记是FD_CLOEXEC
F_GETFD(void)
F_SETFD(long)
C、 文件状态标记
通过open设置的文件状态标记,可以通过fcntl修改,
open
openat()
<span style="font-size:18px;">#include <fcntl.h>
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);</span>
打开指定dirfd目录下的pathname文件路径A、 openat()可以避免通过调用open()出现的竞争情况
B、 允许实现单个线程的CWD
dlopen(), dlsym(), dlclose(), dlerror()
提供动态链接加载器的操作接口
ldopen操作动态链接库<span style="font-size:18px;">void *dlopen(const char *filename, int flag);
#include <dlfcn.h></span>
dlsym()
<span style="font-size:18px;">void *dlsym(void *handle, const char *symbol);</span>
返回symbol所指的内存地址
Sync/syncfs/fsync/fdatasync
fsync:将指定 fd 上的文件数据、以及文件的属性保存到磁盘中,并阻塞直到保存完成。fdatasync:只保证数据本身,不同步文件属性
syncfs:只同步包含指定fd的文件系统的修改
sync:将所有文件的修改(数据和属性)写入到底层文件系统,排入写队列
fdatasync 和 fsync 的作用类似,但是它只保证数据本身被保存到磁盘,但并不同步更新文件的属性(metadata,比如文件的被修改时间,以及文件的大小,等等),对于无须确保文件属性被同步写入的程序,这个调用的性能比同步 fsync 稍高一些。
还有一个条件更弱的调用 —— sync ,它只要求将所有修改过的块缓存区(包括文件数据和文件属性)排入到写队列,然后就返回,它并不等待实际写磁盘操作结束: