优点:设置标准输入为非阻塞(有数据则读 没有数据则立即返回),常用于网络通信以及轻量信息多并发中

步骤:

1.oldflag=fcntl(STDIN_FILENO,F_GETFL);

  获取标准输入的文件打开标志。

2.fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)

  将该标志加入O_NONBLOCK非阻塞标志

3.编写函数逻辑,以及要处理问题。

4.代码如下

//非阻塞模型
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
char *t,buf[4096];

//设置标准输入为非阻塞(有数据则读 没有数据则立即返回)
int ret,oldflag;
oldflag=fcntl(STDIN_FILENO,F_GETFL);
if(oldflag==-1) return 1;//error!!!
if(fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)==-1)
{
perror("set no block\n");
return 2;
}

while(1)
{
t=fgets(buf,4096,stdin);//getchar scanf read ==>stdin
if(t==NULL){
printf("非阻塞返回.\n");
}else{
printf("buf>>>%s\n",buf);
}

printf("do other.\n");
usleep(500000);//0.5s
}

return 0;
}

////////////////////////////////////////////////////////利用阻塞错误、、、、、、、、、、、、、、

//非阻塞模型
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>//使用errno错误标记变量

int main(void)
{
char buf[4096+1];

//设置标准输入为非阻塞(有数据则读 没有数据则立即返回)
int ret,oldflag;
oldflag=fcntl(STDIN_FILENO,F_GETFL);
if(oldflag==-1) return 1;//error!!!
if(fcntl(STDIN_FILENO,F_SETFL,oldflag|O_NONBLOCK)==-1)
{
perror("set no block\n");
return 2;
}

while(1)
{
ret=read(STDIN_FILENO,buf,4096);
if(ret==-1){//error
if(errno==EAGAIN)//非阻塞
{
printf("我要的非阻塞.\n");
}
else
{
perror("read from stdin error");
return 3;
}
}else{
printf("buf>>>%s\n",buf);
}

printf("do other.\n");
usleep(500000);//0.5s
}

return 0;
}

fcntl()函数之非阻塞模型的更多相关文章

  1. Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

    使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...

  2. IO阻塞模型、IO非阻塞模型、多路复用IO模型

    IO操作主要包括两类: 本地IO 网络IO 本地IO:本地IO是指本地的文件读取等操作,本地IO的优化主要是在操作系统中进行,我们对于本地IO的优化作用十分有限 网络IO:网络IO指的是在进行网络操作 ...

  3. IO阻塞模型 非阻塞模型

       IO阻塞模型(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:  所以,blocking IO的特点就是在IO执行的两 ...

  4. io模型---非阻塞模型

    Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果 ...

  5. python IO非阻塞模型

    server端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.setblocking(False) # sk.l ...

  6. select应用于read函数 超时非阻塞方式

    /* * "Timed" read - timout specifies the # of seconds to wait before * giving up (5th argu ...

  7. 第15章 高并发服务器编程(1)_非阻塞I/O模型

    1. 高性能I/O (1)通常,recv函数没有数据可用时会阻塞等待.同样,当socket发送缓冲区没有足够多空间来发送消息时,函数send会阻塞. (2)当socket在非阻塞模式下,这些函数不会阻 ...

  8. 网络I/O模型---同步异步阻塞非阻塞之惑

    网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之改变.C10k的问题,让工程师们需要思考服务的性能与应用的并发能力. 网络应用需要 ...

  9. 什么是阻塞、非阻塞、同步和异步以及IO模型

    首先先看如下几个问题,或者说我们经常会遇到的问题. 阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起.假设你要做一顿便饭:烧土豆: ...

随机推荐

  1. git push的时候.gitignore不起作用的解决方法

    问题的原因 这是因为在你添加.gitignore之前已经进行过push操作,有些文件已经纳入版本管理了. 解决方法 我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了. ...

  2. Vue-router(5)之 路由的before家族

    beforeEach方法 import Vue from 'vue' import Router from 'vue-router' import Son1 from '@/view/New/son1 ...

  3. iris数据集预测

    iris数据集预测(对比随机森林和逻辑回归算法) 随机森林 library(randomForest) #挑选响应变量 index <- subset(iris,Species != " ...

  4. Thread--synchronized&volatile

  5. Java简单调用Lua

    package lua; import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFac ...

  6. Red Hat、Fedora和Ubuntu软件包操作

    五.Red Hat.Fedora和Ubuntu软件包操作对比 最后总结: 在 /etc/yum.conf 的 [main] 后面添加以下配置即可! 复制代码 代码如下: exclude=kernel* ...

  7. python爬虫--cookie反爬处理

    Cookies的处理 作用 保存客户端的相关状态 在爬虫中如果遇到了cookie的反爬如何处理? 手动处理 在抓包工具中捕获cookie,将其封装在headers中 应用场景:cookie没有有效时长 ...

  8. 17.3.12----OS模块ya

    1---他是一xu个python系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. import os#导入这个os模块,其实python模块就是C元的包含很多函数的文件 2---o ...

  9. PAT Basic 1070 结绳(25) [排序,贪⼼]

    题目 给定⼀段⼀段的绳⼦,你需要把它们串成⼀条绳.每次串连的时候,是把两段绳⼦对折,再如下图所示套接在⼀起.这样得到的绳⼦⼜被当成是另⼀段绳⼦,可以再次对折去跟另⼀段绳⼦串连.每次串 连后,原来两段绳 ...

  10. UML-为什么要使用层?

    1.内聚职责:使关系分离.减少耦合和依赖,提高潜在复用性. 2.领域层和技术服务层可以是分布式的 3.利于团队开发