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模型
首先先看如下几个问题,或者说我们经常会遇到的问题. 阻塞是否等于同步?非阻塞是否等于异步?同步一定是阻塞的么?异步一定是非阻塞的么?要把这四个概念讲明白,先从一顿简餐说起.假设你要做一顿便饭:烧土豆: ...
随机推荐
- SeetaFaceQt:写一个简单的界面
关于这个界面,我用到了几个控件,这些控件通过Qt是非常容易构建的,窗口的话用的是QWidget,之前说了,QWidget是Qt里面几乎大部分控件的父类,QWidget的布局我使用了简单的水平布局(QH ...
- centos通过yum安装php
1.添加php的yum软件仓库 sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 2.安装php相关软件,执行过程中全部选择ye ...
- jboss的JVMroute记录
jboss5的nodename是在 /usr/local/jboss-5.1.0.GA/server/dms/deploy/jbossweb.sar/server.xml 这里的 jvmrout ...
- linux tar/ tar.gz文件解压
1.tar 压缩 tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成 ...
- 编程作业1.1——sklearn机器学习算法系列之LinearRegression线性回归
知识点 scikit-learn 对于线性回归提供了比较多的类库,这些类库都可以用来做线性回归分析. 我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法. 我们将scik ...
- webview Java与JS互调
Android调用JS:方法一 webView.loadUrl("javascript:show('"+info+"')"); Android调用JS:方法二 ...
- vscode Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
vscode 连接 mysql 时出现这个错误 alter user 'root'@'localhost' identified with mysql_native_password by 'pass ...
- 小白学习之pytorch框架(6)-模型选择(K折交叉验证)、欠拟合、过拟合(权重衰减法(=L2范数正则化)、丢弃法)、正向传播、反向传播
下面要说的基本都是<动手学深度学习>这本花书上的内容,图也采用的书上的 首先说的是训练误差(模型在训练数据集上表现出的误差)和泛化误差(模型在任意一个测试数据集样本上表现出的误差的期望) ...
- Django框架(五):模型(一) 定义属性
1. 定义属性 Django根据属性的类型确定以下信息: 当前选择的数据库支持字段的类型 渲染管理表单时使用的默认html控件 在管理站点最低限度的验证 django会为表创建自动增长的主键列,每个模 ...
- django的认证演变过程分析
认证规则图: django不分离 drf分类 认证规则演变图 数据库session认证:低效 缓存认证:高效 jwt认证:高效 缓存认证:不易并发 jwt认证:易并发