zoukankan      html  css  js  c++  java
  • linux编程fcntl获取和设置文件状态

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    
    #define ERR_EXIT( m ) 
            do 
            { 
                    perror( m ); 
                    exit( EXIT_FAILURE ); 
            }while( 0 )
    
    //设置某个文件状态
    void set_flag( int fd, int flags );
    //清除某个文件状态
    void clear_flag( int fd, int flags );
    
    int main( int argc, char* argv[] ) {
    
            char buf[64] = { 0 };
            int nread;
    
            //设置非阻塞状态
            set_flag( 0, O_NONBLOCK );
            //清除非阻塞状态, 读取标准输入又变成阻塞
            clear_flag( 0, O_NONBLOCK );
            nread = read( 0, buf, 64 );
            if( -1 == nread ) {
                    ERR_EXIT( "获取输入失败" );
            }
            printf( "buf=%s
    ", buf );
    
            return 0;
    }
    
    void set_flag( int fd, int flags ) {
            int oldflag;
            oldflag = fcntl( fd, F_GETFL, 0 );
            if( -1 == oldflag ) {
                    ERR_EXIT( "获取原来的状态失败" );
            }
    
            oldflag = oldflag | flags;
            int ret = fcntl( fd, F_SETFL, oldflag );
            if( -1 == ret ) {
                    ERR_EXIT( "设置新的文件状态失败" );
            }
    }
    
    void clear_flag( int fd, int flags ) {
            int oldflag;
            oldflag = fcntl( fd, F_GETFL, 0 );
            if( -1 == oldflag ) {
                    ERR_EXIT( "获取原来的状态失败" );
            }
            oldflag = oldflag & ~flags;
            int ret = fcntl( fd, F_SETFL, oldflag );
            if( -1 == ret ) {
                    ERR_EXIT( "设置新的文件状态失败" );
            }
    }
    

      

  • 相关阅读:
    2.6
    20、算法的复杂度
    SVN的部署及分支等方法
    19、数据库设计的三大范式
    2.ViewBag、ViewData、TempData之间的区别
    1、MVC和EF中的 Model First 和 Code First
    19、lambda表达式树
    12、c#中事务及回滚
    11、Linq的使用
    18、(番外)匿名方法+lambda表达式
  • 原文地址:https://www.cnblogs.com/ghostwu/p/10984615.html
Copyright © 2011-2022 走看看