fcntl函数
来源:互联网 发布:育碧彩虹六号数据查询 编辑:程序博客网 时间:2024/04/29 03:51
fcntl函数可以改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open
文件。
#include <unistd.h>#include <fcntl.h>int fcntl(int fd, int cmd);int fcntl(int fd, int cmd, long arg);int fcntl(int fd, int cmd, struct flock *lock);
这个函数和open
一样,也是用可变参数实现的,可变参数的类型和个数取决于前面的cmd
参数。
以下程序通过命令行的第一个参数指定一个文件描述符,同时利用Shell的重定向功能在该描述符上打开文件,然后用fcntl
的F_GETFL
命令取出File Status Flag并打印。
#include "apue.h"#include "error.h"#include <fcntl.h>int main(int argc,char *argv[]){intval;if(argc!=2)err_quit("usage:a.out <descriptor#>");if((val=fcntl(atoi(argv[1]),F_GETFL,0))<0) err_sys("fcntl error for fd %d",atoi(argv[1]));switch(val & O_ACCMODE){case O_RDONLY:printf("read only");break;case O_WRONLY:printf("write only");break;case O_RDWR:printf("read write");break;default:err_dump("unknown access mode");}if (val & O_APPEND)printf(",append");if (val & O_NONBLOCK)printf(",nonblocking");#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");#endifputchar('\n');exit(0);}
运行该程序的几种情况解释如下。
$ ./a.out 0 < /dev/ttyread only
Shell在执行a.out
时将它的标准输入重定向到/dev/tty
,并且是只读的。argv[1]
是0,因此取出文件描述符0(也就是标准输入)的File Status Flag,用掩码O_ACCMODE
取出它的读写位,结果是O_RDONLY
。注意,Shell的重定向语法不属于程序的命令行参数,这个命行只有两个参数,argv[0]
是"./a.out",argv[1]
是"0",重定向由Shell解释,在启动程序时已经生效,程序在运行时并不知道标准输入被重定向了。
$ ./a.out 1 > temp.foo$ cat temp.foowrite only
Shell在执行a.out
时将它的标准输出重定向到文件temp.foo
,并且是只写的。程序取出文件描述符1的File Status Flag,发现是只写的,于是打印write only
,但是打印不到屏幕上而是打印到temp.foo
这个文件中了。
$ ./a.out 2 2>>temp.foowrite only, append
Shell在执行a.out
时将它的标准错误输出重定向到文件temp.foo
,并且是只写和追加方式。程序取出文件描述符2的File Status Flag,发现是只写和追加方式的。
$ ./a.out 5 5<>temp.fooread write
Shell在执行a.out
时在它的文件描述符5上打开文件temp.foo
,并且是可读可写的。程序取出文件描述符5的File Status Flag,发现是可读可写的。
我们看到一种新的Shell重定向语法,如果在<、>、>>、<>前面添一个数字,该数字就表示在哪个文件描述符上打开文件,例如2>>temp.foo表示将标准错误输出重定向到文件temp.foo并且以追加方式写入文件,注意2和>>之间不能有空格,否则2就被解释成命令行参数了。
- fcntl函数
- fcntl函数
- fcntl函数
- fcntl函数
- fcntl函数
- fcntl()函数
- fcntl()函数
- fcntl函数
- fcntl 函数
- fcntl函数
- fcntl函数
- fcntl() 函数
- fcntl 函数
- fcntl函数
- fcntl()函数
- fcntl函数
- fcntl函数
- fcntl()函数
- vim配置
- C的小程序记录(更新131006)
- Java开发中的23种设计模式之十六:迭代器模式(Iterator)
- 树的子结构遍历
- linux c 语言 计时器
- fcntl函数
- 今天的LOGO和首页设计出来了
- 可重入与线程安全
- JAVA笔记:集合系列—LinkedList
- eclipse插件地址
- Java开发中的23种设计模式之十七:责任链模式(Chain of Responsibility)
- 近日百会在京发布“搜索赢家”
- Javascript 垂直滑动伸缩菜单
- sqlplus中开启打印输出功能