[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. 反片语 UVA 156

    //该单词不能通过字母重排,得到输入文本中的另外一个单词.在判断是否满足条件时,字母部分大小写 #include<iostream> #include<vector> #inc ...

  2. Hibernate多对多映射(双向关联)实例详解——真

    一个学生可以选多门课 一门课程有多个学生上 实现步骤: 一.学生 (1)数据库创建学生数据表students,包含id,name字段 设置id字段为主键,类型:bigint,自增 设置name字段,类 ...

  3. capjoint中的tel3核心代码teleseis3.f90

    为了加入更多层的模型 将 teleseis3.f90 /home/capjoint-master/src/tel3/teleseis3.90的地层模型读取部分改为: program test PARA ...

  4. css3宽高设置:calc() / vw / vh

    对于720px的设计稿,100vw == 720px,1vw == 7.2px; vw可以替代rem 实现自适应布局. 相应的计算插件:postcss-px-to-viewport ******** ...

  5. PMS5003ST+Arduino Nano OLED屏显示

    整合OLED显示和PMS5003报数 #include <Arduino.h> #include <pms.h> /////////////////////////////// ...

  6. ChinaCock界面控件介绍-TCCImageViewerForm

    有多个图片,左右滑动可以切换,通过手势还可以放大.缩小查看,象常见的相册,就是这样子实现效果. 现在,我们有了TCCImageViewerForm组件,也可以轻松实现这样的场景应用. 现在看看TCCI ...

  7. 2019-03-06-day012-生成器与推导式

    01 昨日回顾 迭代器: 迭代器有iter方法 next方法就是迭代器 递归: 自己调用自己 明确的结束条件 递归的最大深度 官方 1000 实际测试:998/997 import sys sys.s ...

  8. random_select

    package sorttest;   //expected and worst running time is O(n),asuming that the elements are distinct ...

  9. ubuntu 安装 mysql 的正确姿势

    1.下载官方提供的mysql-apt-config.deb包进行APT源设置,下载地址:https://dev.mysql.com/downloads/repo/apt/ 2. // 将 mysql- ...

  10. webstorm 自动编译ts

    1.在目录根目录添加tsconfig.json { "compileOnSave": false, "compilerOptions": { // 文件目录 & ...