fcntl改变文件状态标志

  • Post author:
  • Post category:其他




IO模型



阻塞I/O:最常用、最简单、效率最低



非阻塞I/O:可防止进程阻塞在I/O操作上,需要轮询



I/O 多路复用:允许同时对多个I/O进行控制



信号驱动I/O:一种异步通信模型

非阻塞I/O:
#include <unistd.h>
#include <fcntl.h>
 int fcntl(int fd, int cmd, ... /* arg */ );
功能:
   实现非阻塞
参数:
   fd:文件描述符
   cmd:设置的命令
   F_GETFL
   F_SETFL
  arg:可有可无  由第二个参数决定

返回值:
  文件状态标志  
  -1 :失败

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



可以用fcntl改变文件状态标志,改变文件为非阻塞状态。

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);



测试代码

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

#define N 128

int main(int argc, const char *argv[])
{
	char buf[N] = { 0 };

	//使用fcntl函数实现非阻塞io
	//对寄存器或者位的操作,一般执行读、改、写三步

	//第一步:读取文件状态标志位
	int flags;
    /* 0====>stdin */
	if((flags = fcntl(0, F_GETFL)) < 0)
	{
		perror("fail to fcntl");
		return -1;
	}

	printf("flags = %#o\n", flags);

	//第二步:修改标志位
	flags = flags | O_NONBLOCK;

	printf("flags = %#o\n", flags);

	//第三步:将新的标志位写回去
	if(fcntl(0, F_SETFL, flags) < 0)
	{
		perror("fail to fcntl");
		return -1;
	}

	while(1)
	{
		sleep(3);
		fgets(buf, N, stdin);

		printf("buf = %s\n", buf);

		sleep(1);

		printf("*****************\n");
	}

	return 0;
}




测试结果

在这里插入图片描述



版权声明:本文为zxy131072原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。