zoukankan      html  css  js  c++  java
  • 利用fcntl函数完成非阻塞IO

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

    下面的例子使用F_GETFLF_SETFL这两种fcntl 命令改变STDIN_FILENO的属性,上O_NONBLOCK 选项,实现非阻塞读终端的功能。

    #include <unistd.h>
    #include <fcntl.h>
    int fcntl(int fd, int cmd, ... /* arg */ );
    
    • 功能:
      改变文件属性
    • 参数:
      fd:文件描述符
      cmd:设置的命令
      F_GETFL
      F_SETFL
      arg:可有可无,由第二个参数决定,比如get时候没有,set时候有值
    • 返回值:
      文件状态标志  
      -1 :失败

    步骤:

    	int flag;//文件状态的标志 
    	flag = fcntl(sockfd, F_GETFL, 0); //读 
    	flag |= O_NONBLOCK;//改
    
    	fcntl(sockfd, F_SETFL, flag);//写
    

    范例:

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
     
    int main()
    {
    	char buf[32] = {0};
    	
    #if 1
    	int flag;
    	flag = fcntl(0, F_GETFL, 0);
    	flag |= O_NONBLOCK;
    	fcntl(0, F_SETFL, flag);
    #endif
     
    	while(1)
    	{
    		gets(buf);
    		printf("quit block
    ");
    		puts(buf);
    		sleep(1);
    	}
    }
    

    运行结果如下:

  • 相关阅读:
    前缀和
    不用加减乘除做加法
    数组中重复的数字
    滑动窗口的最大值
    矩阵中的路径
    Redis 和 Memcached 的区别 Tair
    机器人的运动范围
    汉诺塔问题
    洗牌算法
    斐波那契查找算法(黄金分割查找算法)
  • 原文地址:https://www.cnblogs.com/lixuejian/p/13100536.html
Copyright © 2011-2022 走看看