fcntl()
头文件
#include <unistd.h>
#include <fcntl.h>
函数原型
int fcntl(int fd, int cmd, ... /* arg */);
功能
fcntl函数可以改变已打开的文件的性质。若成功将依赖cmd,错误时返回-1。
参数
cmd = F_GETFD; //获得描述符(void)
cmd = F_DUPFD; //复杂一个现有的描述符(long)
cmd = F_SETFD; //设置描述符(long)
cmd = F_GETEL; //获取文件状态标志(void)
cmd = F_SETTEL; //设置文件状态标志(long)
cmd = F_GETOWN; //获得异步I/O所有权(void)
cmd = F_SETOWN; //设置异步I/O所有权(long)
cmd = F_GETLK; //获取记录锁(struct flock *)
cmd = F_SETLK; //设置记录锁(struct flock *)
cmd = F_SETLKW; //一样(struct flock *)
文件状态标志
unix高级环境编程中的例子
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char * argv[])
{
int val;
if(argc != 2)
{
printf("usage: a.out <descriptor>");
}
if((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
{
printf("fcntl error for fd %d", atoi(argv[1]));
}
switch(val & O_ACCMODE)
{
case O_RDONLY :
printf("read only\n");
break;
case O_WRONLY :
printf("write only\n");
break;
case O_RDWR :
printf("read write");
break;
default:
printf("unknown access mode\n");
}
if(val & O_APPEND)
{
printf(", append");
}
if(val & O_NONBLOCK)
{
printf(", nonblocking\n");
}
#if defined(O_SYNC)
if(val & O_SYNC)
{
printf(", synchronous writes");
}
#endif
#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC)
if(val & O_FSYNC)
{
printf(", synchronous writes");
}
#endif
putchar('\n');
exit(0);
}