当前位置: 首页 > news >正文

营销型企业网站建设的预算青岛网站建设公司哪家好

营销型企业网站建设的预算,青岛网站建设公司哪家好,学做日本料理网站,hpsocket 网站开发非阻塞IO fcntl 一个文件描述符, 默认都是阻塞IO。fcntl可以将某个文件描述符设置为非阻塞IO,先看一下文档介绍。 传入的cmd的值不同,后面追加的参数也不相同。 fcntl函数有5种功能: 复制一个现有的描述符(cmd F_DUPFD)。获得…

非阻塞IO

fcntl

一个文件描述符, 默认都是阻塞IO。fcntl可以将某个文件描述符设置为非阻塞IO,先看一下文档介绍。

image-20230804222205876

传入的cmd的值不同,后面追加的参数也不相同。
fcntl函数有5种功能:

  • 复制一个现有的描述符(cmd = F_DUPFD)。
  • 获得/设置文件描述符标记(cmd = F_GETFD 或 F_SETFD)。
  • 获得/设置文件状态标记(cmd = F_GETFL 或 F_SETFL)。
  • 获得/设置异步I/O所有权(cmd = F_GETOWN 或 F_SETOWN)。
  • 获得/设置记录锁(cmd = F_GETLK, F_SETLK 或 F_SETLKW)。

我们此处只是用第三种功能, 获取/设置文件状态标记, 就可以将一个文件描述符设置为非阻塞。

实现函数SetNonBlock

基于fcntl函数,我们实现一个SetNonBlock函数,将文件描述符设置为非阻塞。

void SetNonBlock(int fd)
{int f1 = fcntl(fd,F_GETFL);if(f1 < 0){std::cerr << "error string" <<strerror(errno) <<"error code: " << errno << std::endl;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}
  • 使用F_GETFL将当前的文件描述符的属性取出来(这是一个位图)。
  • 然后再使用F_SETFL将文件描述符设置回去。设置回去的同时,加上一个O_NONBLOCK参数

实现:

轮询方式读取标准输入,同时还可以执行其他任务。

#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>
#include <cstdio>
#include <vector>
#include <functional>void PrintLog()
{std::cout << "这是一个打印日志的例程" << std::endl;
}
void OperMySQL()
{std::cout << "这是一个操作数据库的例程" << std::endl;
}
void CheckNet()
{std::cout << "这是一个检测网络的例程" << std::endl;
}using func_t = std::function<void (void)>;
std::vector<func_t> funcs;void LoadTask()
{funcs.push_back(PrintLog);funcs.push_back(OperMySQL);funcs.push_back(CheckNet);
}void SetNonBlock(int fd)
{int f1 = fcntl(fd,F_GETFL);if(f1 < 0){std::cerr << "error string" <<strerror(errno) <<"error code: " << errno << std::endl;}fcntl(fd, F_SETFL, f1 | O_NONBLOCK);
}void HandlerAllTask()
{for(const auto& func : funcs){func();}
}int main()
{ char buffer[128];SetNonBlock(0);LoadTask();while(true){printf(">> ");fflush(stdout);ssize_t n = read(0, buffer, sizeof(buffer)-1);// 阻塞在这里,等+拷贝// 1. 读取成功if(n > 0){buffer[n-1] = 0;std::cout << "echo # " << buffer << std::endl;}// 2. 读取结束else if(n == 0){std::cout << "end file" << std::endl;break;}// 3. 读取失败,一旦设置fd为非阻塞,底层没有数据就绪,就以出错返回,但是不算真正的出错else{if(errno == EAGAIN || errno == EWOULDBLOCK){// 底层没有数据,再次读取sleep(1);HandlerAllTask();std::cout << "data not ready" << std::endl;continue;}else if(errno == EINTR){// IO被信号中断,重新读取continue;}else{std::cerr << "read error - " << "error string: " <<strerror(errno) <<"error code: " << errno << std::endl;break;}}}return 0;
}
http://www.yidumall.com/news/83441.html

相关文章:

  • 网站怎么看是谁做的杭州关键词排名提升
  • 怎样做海外淘宝网站宁波seo链接优化
  • 网站搭建网站管理seo文章外包
  • 南通网站外包深圳seo优化外包
  • 网站制作设及的技术线上营销推广方案
  • 常州外贸网站建设整合营销
  • 襄樊北京网站建设广州公司关键词网络推广
  • 常德网站建设网站优化网站优化公司大家好
  • 湖北省建设工程信息网官网seo优化工作
  • dede网站收录网络舆情优化公司
  • 怎么做自己淘宝优惠券网站搜索引擎广告推广
  • 医疗设备网站建设怎么做怎么做个网站
  • 如何加入小说网站做打字员软文推广怎么写
  • wordpress点击慢seo 适合哪些行业
  • 如何用was做网站压力测试最新新闻热点
  • 杭州建委网站seo网络优化软件
  • 个人备案做非经营性网站唐山seo快速排名
  • 省政府投诉热线百度搜索引擎关键词优化
  • 爱建站吧手游推广平台哪个好
  • 大连企业网站哪一家好今日头条极速版官网
  • 石家庄网站建设方案网站建设有哪些公司
  • 蓟州区建设银行官方网站简述什么是百度竞价排名
  • 医疗 企业 网站建设网页设计制作网站
  • 做网站用什么服务器seo搜索优化 指数
  • 网络优化首先要有网站整站seo定制
  • 做网站赚钱 百度网盟口碑营销成功案例有哪些
  • 内蒙古城乡建设厅网站营销型网站制作公司
  • 天门市基础建设网站免费推广的app有哪些
  • 怎么给网站 做排名百度云盘
  • 秦皇岛做网站公司汉狮价格互联网销售是做什么的