[root@bogon code]# cat b.c
#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("a.c",O_RDONLY);//以可读方式打开
int flags;
flags=fcntl(fd,F_GETFL);//用flags记录文件打开状态标志,flags的值至于open里面的打开方式有关,与打开的文件本身属性无关,也就是说假设a.c的属性为777,但是在open时是只以可读方式打开的,那么flags只能检测出可读
if(flags==-1)
perror("fcntl");
if(flags&O_RDWR)//检测是否可读可写
printf("can read can write\n");
else
printf("just can read\n");
return 0;
}
[root@bogon code]# gcc b.c
[root@bogon code]# ./a.out
just can read
[root@bogon code]#

上面这个程序虽然没有错,不过更正确的写法应该是下面这个

[root@bogon code]# cat b.c
#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("a.c",O_RDWR);
int flags,accessMode;
flags=fcntl(fd,F_GETFL);
if(flags==-1)
perror("fcntl");
accessMode=flags&O_ACCMODE;
if(accessMode==O_RDWR)
printf("can read can write\n");
else
printf("just can read\n");
return 0;
}
[root@bogon code]# gcc b.c
[root@bogon code]# ./a.out
can read can write
[root@bogon code]#

接下来我们来见识一下fcntl是如何修改文件打开状态标志的

哪些情况下我们需要修改文件状态标志呢

一:文件不是由调用程序打开,所以程序也无法使用open函数来控制文件的状态标志,例如标准输入输出描述符

二:文件描述符的获取是通过open之外的系统调用,例如pipe以及socket等。

[root@bogon code]# cat b.c
#include<stdio.h>
#include<error.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("a.c",O_RDWR);
int flags,accessMode;
flags=fcntl(fd,F_SETFL);
if(flags==-1)
perror("fcntl");
flags|=O_APPEND;//添加O_APPEND标志
fcntl(fd,F_SETFL,flags);//设置O_APPEND标志
if(flags==O_APPEND)
printf("can append\n");
if(flags==O_RDWR)//我这里只是用来测试原来的状态标志会不会改变,从结果来看,貌似会的
printf("just can read and write\n");
else
printf("just can't read and write\n");
return 0;
}
[root@bogon code]# gcc b.c
[root@bogon code]# ./a.out
can append
just can't read and write
[root@bogon code]#

fcntl获取和修改文件打开状态标志的更多相关文章

  1. 第七篇:使用 fcntl 函数 获取,设置文件的状态标志

    前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢? 本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1 ...

  2. 使用 fcntl 函数 获取,设置文件的状态标志

    前言 当打开一个文件的时候,我们需要指定打开文件的模式( 只读,只写等 ).那么在程序中如何获取,修改这个文件的状态标志呢?本文将告诉你如何用 fcntl函数 获取指定文件的状态标志. 解决思路 1. ...

  3. fcntl()函数之文件打开状态

    比较有用的就两个. 1.获得/设置文件打开状态标志 oldflag=fcntl(fd,F_GETFL); 获得打开文件的状态标志. arg=oldflag|O_APPEND; fcntl(fd,F_S ...

  4. C#获取并修改文件扩展名的方法

    本文实例讲述了C#获取并修改文件扩展名的方法.分享给大家供大家参考.具体分析如下: 这里使用C#编程的方法改变文件扩展名的文件,必须使用Path类. Path类用来解析文件系统路径的各个部分.静态方法 ...

  5. 在Delphi中获取和修改文件的时间

    转载自 http://www.cnblogs.com/jieke/archive/2013/01/11/2855782.html 本文介绍了在Delphi中利用系统函数和Windows API函数调用 ...

  6. linux修改文件打开最大数(ulimit命令)

    解除 Linux 系统的最大进程数和最大文件打开数限制:vi /etc/security/limits.conf# 添加如下的行* soft noproc 65536 * hard noproc 65 ...

  7. linux编程fcntl获取和设置文件状态

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> ...

  8. linux 修改文件打开数量限制

    1.查看打开文件数量限制 ulimit -a ulimit -n 2.临时修改 ulimit -n 2048 3.永久修改 vi /etc/security/limits.conf 追加 * soft ...

  9. Centos修改文件打开数限制

    一.查看系统限制最大打开数 cat /proc/sys/fs/file-max 还有一个问题是file-max最大能设置多大呢?一个经验算法是 256个fd 需4M内存.例如8G内存,8*1024/4 ...

随机推荐

  1. day26 第二阶段共享

    第二阶段共享--网络编程 一.C/S架构 : 客户端(client)/服务端(sever)框架 B/S架构: 浏览器(brower)/服务端(sever)架构 软件CS架构: 服务端连接到浏览器,QQ ...

  2. getchar getche getch的区别

    getchar 由宏实现:#define getchar() getc(stdin). getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘 ...

  3. [转]如何远程连接运行OpenGL/Cuda 等GPU程序

    发现一篇神文,解决了困扰许久的远程桌面OpenGL/GPU 等问题... 原地址在这:http://www.tanglei.name/how-to-run-gpu-programs-using-rem ...

  4. Linux输入子系统 : 按键驱动

    一.Linux input system框架: 1.由输入子系统核心层(input.c),驱动层(gpio_keys.c)和事件处理层(Event Handler)三部份组: 2.主要的三个结构体:i ...

  5. 虚拟机中扩展linux系统存储空间

    reference: https://blog.csdn.net/greenapple_shan/article/details/52799631 https://blog.csdn.net/lyd1 ...

  6. python笔记4-if..elif-else条件语句

    python中条件判断使用if else来判断,多分支的话使用if elif ... else,也就是如果怎么怎么样就怎么怎么样,否则就怎么怎么这样,格式如下: #if是布尔类型判断,1个是真1个是假 ...

  7. linux Bash 常用

    linux 帮助文档 man + [命令] eg: man ls[命令] + --help eg:ls --helphelp +[命令] eg:help ceinfo + [命令] eg:info l ...

  8. 转-Asynchronous bulk transfer using libusb

    https://falsinsoft.blogspot.jp/2015/02/asynchronous-bulk-transfer-using-libusb.html The 'linusb' is ...

  9. MySQL:MySQL Workbench的使用

    MySQL Workbench 一.布局介绍 附:图片转自https://blog.csdn.net/qq_19891827/article/details/53995079 二.创建数据库 第一步: ...

  10. nodejs --- querystring模块.

    1. 序列化: querystring.stringify(对象, 参数2, 参数3) 第二个参数 设置 连接符   从 & 变为 , 第三个参数 设置 key  和value的中间符号,  ...