fcntl()的作用是根据文件描述符来获取或设置文件的访问控制属性
头文件:
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
函数定义:
int fcntl(int filedes, int cmd);
int fcntl(int filedes, int cmd, longarg);
int fcntl(int filedes, int cmd,structflock *lock);
参数:
fd:文件描述词。
cmd:操作命令。 F_GETFL :读取文件状态标志。 F_SETFL :设置文件状态标志。
arg:供命令使用的参数。
lock:加锁。
返回值:
若成功返回值依赖于cmd(见下),若出错为-1
fcntl()的命令说明:
复制一个现存的描述符(cmd=F_DUPFD或F_DUPFD_CLOEXEC)
获得/设置文件描述符标记(cmd = F_GETFD或F_SETFD)
获得/设置文件状态标志(cmd = F_GETFL或F_SETFL)
获得/设置异步I/O所有权(cmd = F_GETOWN或F_ SETOWN)
获得/设置记录锁(cmd = F_GETLK , F_SETL K或F_SETLKW)
F_SETFD与F_SETFL的注意事项
在修改文件描述符标志或文件状态标志时必须谨慎,先要取得现在的标志值,然后按照希望修改它,最后设置新标志值。
不能只是执行 F_SETFD或F_SETFL命令,这样会关闭以前设置的标志位
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
int main(void){
int fd=fcntl(STDIN_FILENO,F_FGETFL);
fd=fd|O_NONBLOCK;
if(fcntl(STDIN_FILENO,SETFL,fd)<0)
perror("main fcntl");
exit(1);
return 0;
}