fcntl()函数之非阻塞模型
优点:设置标准输入为非阻塞(有数据则读 没有数据则立即返回),常用于网络通信以及轻量信息多并发中
步骤:
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()函数之非阻塞模型的更多相关文章
- Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型
使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为 ...
- IO阻塞模型、IO非阻塞模型、多路复用IO模型
IO操作主要包括两类: 本地IO 网络IO 本地IO:本地IO是指本地的文件读取等操作,本地IO的优化主要是在操作系统中进行,我们对于本地IO的优化作用十分有限 网络IO:网络IO指的是在进行网络操作 ...
- IO阻塞模型 非阻塞模型
IO阻塞模型(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 所以,blocking IO的特点就是在IO执行的两 ...
- io模型---非阻塞模型
Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果 ...
- python IO非阻塞模型
server端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 8010)) sk.setblocking(False) # sk.l ...
- select应用于read函数 超时非阻塞方式
/* * "Timed" read - timout specifies the # of seconds to wait before * giving up (5th argu ...
- 第15章 高并发服务器编程(1)_非阻塞I/O模型
1. 高性能I/O (1)通常,recv函数没有数据可用时会阻塞等待.同样,当socket发送缓冲区没有足够多空间来发送消息时,函数send会阻塞. (2)当socket在非阻塞模式下,这些函数不会阻 ...
- 网络I/O模型---同步异步阻塞非阻塞之惑
网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之改变.C10k的问题,让工程师们需要思考服务的性能与应用的并发能力. 网络应用需要 ...
- 什么是阻塞、非阻塞、同步和异步以及IO模型
首先先看如下几个问题,或者说我们经常会遇到的问题. 阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起.假设你要做一顿便饭:烧土豆: ...
随机推荐
- git push的时候.gitignore不起作用的解决方法
问题的原因 这是因为在你添加.gitignore之前已经进行过push操作,有些文件已经纳入版本管理了. 解决方法 我们就应该先把本地缓存删除,然后再进行git的push,这样就不会出现忽略的文件了. ...
- Vue-router(5)之 路由的before家族
beforeEach方法 import Vue from 'vue' import Router from 'vue-router' import Son1 from '@/view/New/son1 ...
- iris数据集预测
iris数据集预测(对比随机森林和逻辑回归算法) 随机森林 library(randomForest) #挑选响应变量 index <- subset(iris,Species != " ...
- Thread--synchronized&volatile
- Java简单调用Lua
package lua; import org.keplerproject.luajava.LuaState; import org.keplerproject.luajava.LuaStateFac ...
- Red Hat、Fedora和Ubuntu软件包操作
五.Red Hat.Fedora和Ubuntu软件包操作对比 最后总结: 在 /etc/yum.conf 的 [main] 后面添加以下配置即可! 复制代码 代码如下: exclude=kernel* ...
- python爬虫--cookie反爬处理
Cookies的处理 作用 保存客户端的相关状态 在爬虫中如果遇到了cookie的反爬如何处理? 手动处理 在抓包工具中捕获cookie,将其封装在headers中 应用场景:cookie没有有效时长 ...
- 17.3.12----OS模块ya
1---他是一xu个python系统编程的操作模块,可以处理文件和目录这些我们日常手动需要做的操作. import os#导入这个os模块,其实python模块就是C元的包含很多函数的文件 2---o ...
- PAT Basic 1070 结绳(25) [排序,贪⼼]
题目 给定⼀段⼀段的绳⼦,你需要把它们串成⼀条绳.每次串连的时候,是把两段绳⼦对折,再如下图所示套接在⼀起.这样得到的绳⼦⼜被当成是另⼀段绳⼦,可以再次对折去跟另⼀段绳⼦串连.每次串 连后,原来两段绳 ...
- UML-为什么要使用层?
1.内聚职责:使关系分离.减少耦合和依赖,提高潜在复用性. 2.领域层和技术服务层可以是分布式的 3.利于团队开发