zoukankan      html  css  js  c++  java
  • fcntl 函数

    设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在server开发中可以封装为基本函数)  

    fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,阻塞设置成非阻塞,非阻塞设置成阻塞(这连个在server开发中可以封装为基本函数)  

    2010-11-26 18:02:18|  分类: Linux系统编程 |  标签: |举报 |字号 订阅

     
     

    1、获取文件的flags,即open函数的第二个参数:

           flags = fcntl(fd,F_GETFL,0);

    2、设置文件的flags:

          fcntl(fd,F_SETFL,flags);

    3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:

           flags = fcntl(fd,F_GETFL,0);

           flags |= O_NONBLOCK;

          fcntl(fd,F_SETFL,flags);

    4、取消文件的某个flags,比如文件是非阻塞的,想设置成为阻塞:

          flags = fcntl(fd,F_GETFL,0);

          flags &= ~O_NONBLOCK;

          fcntl(fd,F_SETFL,flags);

    获取和设置文件flags举例::

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <fcntl.h>

    #include <error.h>

    char buf[500000];

    int main(int argc,char *argv[])

    {        

          int ntowrite,nwrite;        

          const char *ptr ;       

          int flags;     
          ntowrite = read(STDIN_FILENO,buf,sizeof(buf));      

          if(ntowrite <0)        

         {                 

             perror("read STDIN_FILENO fail:");               

             exit(1);        

         }          

         fprintf(stderr,"read %d bytes ",ntowrite);            

        if((flags = fcntl(STDOUT_FILENO,F_GETFL,0))==-1)        

        {                  

           perror("fcntl F_GETFL fail:");                

          exit(1);        

        }   
        flags |= O_NONBLOCK;        

        if(fcntl(STDOUT_FILENO,F_SETFL,flags)==-1)        

        {   
            perror("fcntl F_SETFL fail:");                

            exit(1);        

        }              

    ptr = buf;        

    while(ntowrite > 0)        

    {                  

         nwrite = write(STDOUT_FILENO,ptr,ntowrite);                

        if(nwrite == -1) 
        {  

              perror("write file fail:");                

        }                  

       if(nwrite > 0)                

       {                         

        ptr += nwrite;                        

        ntowrite -= nwrite;                

       }  
     }              

       flags &= ~O_NONBLOCK;        

       if(fcntl(STDOUT_FILENO,F_SETFL,flags)==-1)     

        {   
                perror("fcntl F_SETFL fail2:");        

        }         

         return 0;

    }

  • 相关阅读:
    爱情的诗·1~5节
    人生的诗·381~385节
    人生的诗·375~380节
    python数据类型初始1
    python编码知识初始_ASCII码,Unicode,Utf-8,GBK
    Python运算符,逻辑运算
    python格式化输出%,while else
    pycharm使用教程链接+部分练习题01
    python流程控制-条件语句If,while循环
    python基础数据类型初始,用户交互
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3731589.html
Copyright © 2011-2022 走看看