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模型
首先先看如下几个问题,或者说我们经常会遇到的问题. 阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起.假设你要做一顿便饭:烧土豆: ...
随机推荐
- 云服务器Linux版本下---安装git
xshell进入云服务器: 按照git官网:https://git-scm.com/download/linux 的教程输入: apt-get install git 本地没有包????? 原来是 ...
- with和上下文管理器
with和上下文管理器 如果你有时间阅读源码的习惯,可能会看到一些优秀的代码会出现带有with关键字的语句. 对于系统资源如文件,数据库连接,socket而言,应用程序打开这些资源并执行完业务逻辑之后 ...
- Mysql 3306 被 linux 防火墙拦截
项目测试时需要本地连接linux服务器的mysql, 发现navicat无法连接 原因一:mysql没有添加外部ip的访问权限. 原因二:mysql 的 3306 端口 处于被防火墙的拦截状态. 解决 ...
- UVALive 4794 Sharing Chocolate DP
这道题目的DP思想挺先进的,用状态DP来表示各个子巧克力块.原本是要 dp(S,x,y),S代表状态,x,y为边长,由于y可以用面积/x表示出来,就压缩到了只有两个变量,在转移过程也是很巧妙,枚举S的 ...
- HDU 2795 Billboard 线段树活用
题目大意:在h*w 高乘宽这样大小的 board上要贴广告,每个广告的高均为1,wi值就是数据另给,每组数组给了一个board和多个广告,要你求出,每个广告应该贴在board的哪一行,如果实在贴不上, ...
- SQL基础教程(第2版)第4章 数据更新:4-3 数据的更新(UPDATE)
第4章 数据更新:4-3 数据的更新(UPDATE) ● 使用UPDATE语句可以更改(更新)表中的数据.● 更新部分数据行时可以使用WHERE来指定更新对象的条件.通过WHERE子句指定更新对象的U ...
- 安装lombok插件IDEA的插件栏加载不出来
打开 Setting-->Appearance & Behavior -->Syetem Setting -->Updates,将Use secure connection ...
- Python对象赋值、浅拷贝、深拷贝
Python中,基本数据类型,理解为常见数据类型:布尔型.整型.浮点型.字符串.列表.元组.字典.集合,随语言不同而不同,但是根据在内存中存储方式的不同,区分开原子类型和容器类型. 对象赋值 对象的赋 ...
- MJJ玩磁铁
题目: Problem D: MJJ玩磁铁 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 139 Solved: 9[Submit][Status][ ...
- 创建DateFrame的常用四种方式
import pandas as pd %pylab 一.使用numpy创建 df = pd.DataFrame(np.arange(16).reshape((4,4)), index=list('a ...