zoukankan      html  css  js  c++  java
  • fcntl获取和修改文件打开状态标志

    [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
    ");
        else
            printf("just can read
    ");
        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
    ");
        else
            printf("just can read
    ");
        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
    ");
        if(flags==O_RDWR)//我这里只是用来测试原来的状态标志会不会改变,从结果来看,貌似会的
            printf("just can read and write
    ");
        else
            printf("just can't read and write
    ");
        return 0;
    }
    [root@bogon code]# gcc b.c
    [root@bogon code]# ./a.out
    can append
    just can't read and write
    [root@bogon code]# 
    
  • 相关阅读:
    C#低级Windows API钩子拦截键盘输入
    PowerDesigner 11 使用心得
    c# windows服务状态、启动和停止服务
    PowerDesigner设计数据库
    C# Windows帐户和目录添加用户权限方法
    ASP.NET的控件Gridview在Firefox中的Border显示问题
    去掉图片连接的虚框
    http://www.ediyang.com/demo/DD_Png/
    WEB前端开发规范文档(for: mrthink.net)
    .net下载文件的常用方法汇总
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730631.html
Copyright © 2011-2022 走看看