fcntl()不用重新打开文件就能修改文件属性

普通文件不会阻塞
fcntl:
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK; 位图–二进制位
int ret = fcntl(fd, F_SETFL, flags);
获取文件状态: F_GETFL
设置文件状态: F_SETFL

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

#define MSG_TRY "try again\n"

int main(int argc, char *argv[])
{
 char buf[10];
 int flags, n;
 flags = fcntl(STDIN_FILENO, F_GETFL);  //获取文件属性
if(flags == -1
{
  perror("fcntl error\n");
  exit(1);
}
flags |= O_NONBLOCK;		//文件属性附加 非阻塞
int ret = fcntl(STDIN_FILENO, F_SETFL, flags);  //设置文件属性
if(ret == -1)
{
 perror("f_setfl error");
 exit(1);
}
n = read(STDIN_FILENO, buf, 10);
if(n < 0)
{
 if(errno != EAGAIN)
 {
  perror("read error\n");
  exit(1);
 }
 sleep(3);
 write(STDOUT_FILENO,MSG_TRY, strlen(MSG_TRY));
 goto tryagain;
}
write(STDOUT_FILENO, buf, n);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值