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;

}

原文地址:https://www.cnblogs.com/lvdongjie/p/3731589.html