Linux 系统编程 fcntl函数

Linux 系统编程 fcntl函数

更改阻塞和非阻塞的属性

fcntl


头文件
#include <unistd.h>
#include <fcntl.h>
函数签名
 int fcntl(int fd, int cmd, ... /* arg */ );
参数

fd:
int类型,文件描述符;
cmd:
表示可变参数;

获取和设置文件属性
F_GETFL:
表示要通过 fcntl获取当前打开文件的文件属性,不需要额外参数;
F_SETFL:
表示用设置当前打开文件的文件属性,后面需要跟一个参数 int整数,表示要设置的属性值;

返回值

取决于第二个参数传的是什么宏;
F_GETFL:
返回文件的属性(位图,每一位代表一个属性),有一位表示文件是否阻塞,0 阻塞,1 非阻塞;
F_SETFL:
返回0;

示例

读取标准输入(STDIN_FILENO)

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

int main(int argc, char *argv[]){
	int flag = fcntl(STDIN_FILENO, F_GETFL);
	flag |= O_NONBLOCK;
	fcntl(STDIN_FILENO, F_SETFL, flag);
	char buf[1024];
	int rsize = read(STDIN_FILENO, buf, 10);
	if(rsize == -1){
		if(errno == EAGAIN){
			printf("以非阻塞方式访问设备文件,且没有数据\n");
			exit(1);
		}
		perror("read error");
		exit(1);
	}
	return 0;
}

注:

  1. 以非阻塞方式,访问设备文件,并且里面没有数据,返回 -1,设置 errno为 EAGAIN;
  2. 标准输入、标准输出、标准错误,当进程运行时,就是默认打开的,不需要打开,也不需要关闭;
结果

在这里插入图片描述

2020/07/23 17:06
@luxurylu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值