fcntl存在于
#include<fcntl.h>中
fcntl第一个参数是你要改变的阻塞参数比如标准输入标准输出,第二个参数是宏,比如你要获取它的两个字节的信息或者你要改变或建立它的两个字节信息
比如标准输入是0100 0010(二进制)
get就得到了返回这个数据set就是建立
后面的参数是可变的,比如你要get这个参数就不用加参数,set的话就要加你建立的数据。
/**********************hsj**************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#include<errno.h>
int main(int argc, char* argv[]){
char buf[1024];
int flag = fcntl(STDIN_FILENO, F_GETFL);
flag |= O_NONBLOCK;
fcntl(STDIN_FILENO, F_SETFL, flag);
fcntl(STDIN_FILENO, F_SETFL, 1026);
int rr = read(STDIN_FILENO, buf, 1024);
if(rr == -1){
if(errno == EAGAIN | errno == EWOULDBLOCK){
printf("以非阻塞读文件,文件里没有文件\n");
}
}
write(STDOUT_FILENO, buf, rr);
return 0;
}
/***************************************************/
从上图看出我们用 fcntl改变了标准输入的阻塞状态,由之前的阻塞等待到非阻塞。
思考:
怎么更改代码重新阻塞:
flag &=(~O_NONBLOCK);
fcntl(STDIN_ F_SETFL, flags);
取反位与:
1100 0000 0010
& 0011 1111 1101
可以通过这种解除阻塞的方法,在不适用多线程/多进程的前提下,创建并发服务器(没什么价值,需要创建一个数组用来保存客户端的cfd)【必须长时间占用cpu】