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

做电影下载网站好企业在线

做电影下载网站好,企业在线,深圳市房地产信息系统平台,成都装修公司哪家好Linux系统高级IO 阻塞式IO的困境 程序中读取键盘 #include <stdio.h> int main(void) {// 键盘就是标准输入,stdin&#xff0c;文件描述符是0char buf[100];memset(buf, 0, sizeof(buf));read(0, buf ,2);printf("%s",buf);exit(0); }程序中读取鼠标 #include…

Linux系统高级IO

  • 阻塞式IO的困境

程序中读取键盘

#include <stdio.h>
int main(void)
{// 键盘就是标准输入,stdin,文件描述符是0char buf[100];memset(buf, 0, sizeof(buf));read(0, buf ,2);printf("%s",buf);exit(0);
}

程序中读取鼠标

#include <stdio.h>
int main(void)
{int fd = -1;char buf[100];fd = open("/dev/input/mouse1",O_RDONLY);if (fd < 0){perror("mouse fail");exit(-1);}memset(buf, 0, sizeof(buf));read(fd, buf ,50);printf("%s",buf);exit(0);
}

程序中同时读取键盘和鼠标

以下方式只能先读鼠标再读键盘!!!因为程序被鼠标读阻塞住了!解决方法是并发式IO!

#include <stdio.h>
int main(void)
{int fd = -1;char buf[100];// 鼠标fd = open("/dev/input/mouse1",O_RDONLY);if (fd < 0){perror("mouse fail");exit(-1);}memset(buf, 0, sizeof(buf));read(fd, buf ,50);printf("mouse:%s",buf);// 键盘memset(buf, 0, sizeof(buf));read(0, buf ,2);printf("keyboard:%s",buf);exit(0);
}
  • 非阻塞式IO
    没办法读取,直接结束!但可以在一个while循环里以轮询方式实现,但性能不好!
#include <stdio.h>
int main(void)
{// 把文件描述符变成非阻塞的int flag = -1;flag = fcntl(0, F_GETFL);// 获取flagflag |= O_NONBLOCK;//添加非阻塞属性fcntl(0, F_SETFL, flag);//设置flagchar buf[100]// 键盘memset(buf, 0, sizeof(buf));read(0, buf ,2);printf("keyboard:%s",buf);exit(0);
}
  • IO多路复用

用来应对并发IO。

  • select / poll
    select / poll 本身是阻塞式的,内部是非阻塞式的(以非阻塞式自动轮询多路阻塞式IO),但与while不同,可以让出CPU。

用select函数实现同时读取键盘鼠标

#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>int main() {int fd = -1;char buf[100];// 鼠标fd = open("/dev/input/mouse1",O_RDONLY);if (fd < 0){perror("mouse fail");exit(-1);}fd_set readfds;                  // 读集合struct timeval timeout;          // 超时时间FD_ZERO(&readfds);               // 清空集合FD_SET(0, &readfds);  // 键盘FD_SET(fd, &readfds);  // 鼠标timeout.tv_sec = 5;              // 超时时间为 5 秒timeout.tv_usec = 0;printf("等待输入(5 秒超时)...\n");int ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &timeout);if (ret == -1) {perror("select 出错");exit(-1);} else if (ret == 0) {printf("超时,没有输入\n");exit(0);} else {// 处理键盘if (FD_ISSET(0, &readfds)) {memset(buf, 0, sizeof(buf));read(0, buf ,2);printf("keyboard:%s",buf);}// 处理鼠标if (FD_ISSET(fd, &readfds)) {memset(buf, 0, sizeof(buf));read(fd, buf ,50);printf("mouse:%s",buf);}}return 0;
}
  • 异步IO

异步IO就是操作系统用软件实现的一套中断响应系统。异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。

void sig_fun() {int data = 0;int n = read(mousefd, &data, sizeof(data));if (n < 0) {printf("read mouse error\n");}else {printf("%d\n", data);}
}struct sigaction sa;
struct sigaction od_sa;sa.sa_handler = sig_fun;
sigemptyset(&sa.sa_mask);
sigaddset(&sa.sa_mask, SIGIO); // SIGIO添加进信号集
sa.sa_flags = 0;// 1. 调用sigaction为SIGIO信号建立信号处理程序
sigaction(SIGIO, &sa, &od_sa); // 捕获SIGIO后, 处理信号时, 阻塞信号; 处理完毕后恢复// 2. 以命令F_SETOWN调用fcntl来设置进程ID, 用于接收对该描述符的信号(SIGIO)
if (fcntl(mousefd, F_SETOWN, getpid()) < 0) {perror("fcntl F_SETOWN error");exit(1);
}// 3. 以命令F_SETFL调用fcntl, 设置O_ASYNC文件状态标识, 使得在该描述符上可以进行异步IO
int flag = fcntl(mousefd, F_GETFL);
if (flag < 0) {perror("fcntl F_GETFL error");exit(1);
}
flag |= O_ASYNC;ret = fcntl(mousefd, F_SETFL, flag);
if (ret < 0) {perror("fcntl F_SETFL error");exit(1);
}while (1) {usleep(50);
}
  • 存储映射IO

不需要把内存复制到另一地址,直接映射。
(1)共享而不是复制,减少内存操作
(2)处理大文件时效率高,小文件不划算

  • mmap

使用mmap()函数将 LCD 显存的物理地址映射到进程的虚拟地址空间。

#include <sys/mman.h>char *fbp = (char *)mmap(0, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (fbp == MAP_FAILED) {perror("mmap");close(fd);return -1;
}

文章转载自:

http://3PPsTsfp.sgbsr.cn
http://MOBnJ7Jv.sgbsr.cn
http://5u2gnt2P.sgbsr.cn
http://XjqrHIv6.sgbsr.cn
http://fyrt88ad.sgbsr.cn
http://2kySS7Qw.sgbsr.cn
http://o1YLjQ1Z.sgbsr.cn
http://sRgsffTi.sgbsr.cn
http://0hDm0kAl.sgbsr.cn
http://ejbk6O2J.sgbsr.cn
http://kcepAzAI.sgbsr.cn
http://Wzh8zC7l.sgbsr.cn
http://gQeJc35p.sgbsr.cn
http://4BSqR3Di.sgbsr.cn
http://yElFtxJc.sgbsr.cn
http://GuF5DZnn.sgbsr.cn
http://HXMLJrkG.sgbsr.cn
http://gE994P1Z.sgbsr.cn
http://81ZVtLvZ.sgbsr.cn
http://HDDyz5o1.sgbsr.cn
http://QrZmGd0V.sgbsr.cn
http://yMpFfuPD.sgbsr.cn
http://Bu76zhkn.sgbsr.cn
http://AhXlH1xf.sgbsr.cn
http://9b3ap0XQ.sgbsr.cn
http://2653L9PK.sgbsr.cn
http://zuPoyOMK.sgbsr.cn
http://Z4ps9Ai9.sgbsr.cn
http://Dk7evTpn.sgbsr.cn
http://LECOXQSz.sgbsr.cn
http://www.dtcms.com/wzjs/728090.html

相关文章:

  • 网站怎么上传ftp营销网站建设是什么
  • 常州网站制作机构新手怎么学做网站
  • 抖音里做我女朋友网站网站正在建设中动画
  • 自己做网站买东西描述一下网站建设的基本流程图
  • 南京哪家做网站好汽车网站建设
  • 如何在网站上做咨询浮动窗口seo外链网站
  • 深圳专业做网站排名哪家好百度seo关键词优化推荐
  • 怎么在国外建网站互联网金融p2p网站建设
  • 做热图的网站网站在线压缩
  • at结尾网站商场大型话题活动策划网站
  • 网站建设与运营总结开发应用
  • 南京电商网站建设公司佛山企业如何建网站
  • 苏州公司网站设计网站开发主流技术线路介绍
  • 中国建设银行个人登陆网站网站开发产生费用分录怎么写
  • 制作个网站大概多少钱关于汽车的网站
  • 自己做的网站绑定域名网站建设的含义
  • 湖北省建设厅官方网站文件网站建设 6万
  • 网站建设毕业设计摘要wordpress 输出文章
  • 为什么要网站备案网站 没有域名需要备案吗
  • 做财税的网站有哪些网站开发创业
  • 如何给网站引流买域名要多少钱一个
  • 沙田做网站途牛网站建设策划书
  • 网站的设计与实现开题报告网站死链检查
  • 西安做网站选哪家龙口seo
  • 做一个网站建设广东旅游网站建设方案
  • 陕西网站开发公司哪家好河西网站建设制作
  • 怎么在文档中做网站一点就开浏览器无法上网但有网
  • 广州从化网站建设申请空间 建立网站吗
  • 获取网站访客qq号网站建设案例资料
  • 手机网站建站流程中建五局华东建设公司网站