七、fcntl(操作文件的特性)
1、头文件:#include <unistd.h> #include <fcntl.h>
2、函数原型:int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);
3、函数形参:fd:文件描述词;
cmd:操作命令;
arg:供命令使用的参数;
lock:同arg。
4、函数返回值:与命令有关。如果出错,所有命令都返回-1,如果成功则返回某个其他。
下列三个命令有特定返回值:
F_DUPFD返回新的文件描述符;
F_GETFD返回相应标志;
F_GETFL以及F_GETOWN返回一个正的进程ID或负的进程组ID。
5、功能描述:(file control)根据文件描述词来操作文件的特性。
具体功能及其对应cmd值(5种):
(1)复制一个现有的描述符(cmd=F_DUPFD)。
(2)获得/设置文件描述符标志(cmd=F_GETFD或F_SETFD)。
(3)获得/设置文件状态标志(cmd=F_GETFL或F_SETFL)。
(4)获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN)。
(5)获得/设置记录锁(cmd=F_GETLK,F_SETLK或F_SETLKW)。
6、特殊文件描述符:1个程序会打开3个文件:标准输入0,标准输入1,标准出错2。
7、阻塞与非阻塞
(1)阻塞:指调用结果返回前,当前线程会被挂起。调用线程只有在得到结果后才会返回。
(2)非阻塞:指在不能立刻得到结果前,该调用不会阻塞当前线程。
(3)阻塞和非阻塞,描述的是一种状态,同步与非同步描述的是行为方式
(4)读文件因为没有数据而阻塞会进入休眠状态,休眠时不占用cpu,节省cpu资源。
(5)举例(来源知乎):
你打电话问书店老板有没有某本书,若是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,若是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。在这里阻塞与非阻塞与是否同步异步无