文件IO操作原理(04)——fcntl函数

5、fcntl函数

可以用fcntl函数改变一个已打开的文件的属性,可以重新设置读、写、追加、非阻塞等标志(这些标志称为File Status Flag),而不必重新open文件。

#include <unistd.h>

#include <fcntl.h>

int fcntl(int fd, int cmd, ... /* arg */ );

fcntl是一个可变参数函数

fd:文件描述符(操作对象)

cmd:执行的操作标志

fcntl() 执行操作一个已经打开了的文件的文件描述符fd.这个操作来自 cmd 参数。

fcntl() 可以有一个可选的第三参数. 无论有没有这个参数,都必须有cmd参数.

File status flags 文件状态标识

F_DUPFD (long) 复制一个现有的文件描述符

F_GETFD (void) 获取一个文件的文件描述符标记

F_SETFD (long) 设置一个文件的文件描述符标记

F_GETFL (void) 获取文件状态标志

F_SETFL (long) 设置文件状态标志

 

fcntl函数修改标准输入流文件状态

   1: #include <unistd.h>
   2: #include <fcntl.h>
   3: #include <errno.h>
   4: #include <string.h>
   5: #include <stdlib.h>
   6: #include <stdio.h>
   7:  
   8: #define MSG_TRY "try again\n"
   9: #define MSG_TIMEOUT "time out\n"
  10:  
  11: int main()
  12: {
  13:     char buf[1024]={0};
  14:     //获取标准输入流文件的状态标识(读取属性)
  15:     int flags=fcntl(STDIN_FILENO,F_GETFL);
  16:     //加上非阻塞标识
  17:     flags |=O_NONBLOCK;
  18:     //设置标准输入流文件的状态标志(更新)
  19:     if(-1==fcntl(STDIN_FILENO,F_SETFL,flags)){
  20:         perror("fcntl ");   //设置失败
  21:         exit(-1);
  22:     }
  23:     int len=0;
  24:     int t=10;
  25:     while(--t){
  26:         //非阻塞模式,不会等待
  27:         len=read(STDIN_FILENO,buf,1024);
  28:         if(len<0){
  29:             if(errno==EAGAIN){  
  30:                 sleep(1);
  31:                 write(STDOUT_FILENO,MSG_TRY,strlen(MSG_TRY));
  32:                 continue;   //读取失败,再次尝试
  33:             }
  34:         }
  35:         break;  //读取成功或超时,跳出
  36:     }
  37:     if(t){  //输出读取到内容到标准输出流文件
  38:         write(STDOUT_FILENO,buf,strlen(buf));
  39:     }else{
  40:         printf(MSG_TIMEOUT);    //读取超时
  41:     }
  42:  
  43:     return 0;
  44: }

你可能感兴趣的:(文件IO操作原理(04)——fcntl函数)