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;

    }

  • 相关阅读:
    汇编指令(它不区分大小写)
    汇编
    LINUX命令
    LInux 终端命令
    回文串的Manacher算法
    hdu3336 Counting the string kmp的next数组的应用
    hdu2203kmp匹配
    hdu2087kmp模板练习
    hdu1171kmp果题
    hdu1686kmp果题
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3731589.html
Copyright © 2011-2022 走看看