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

视频网站开发者工具怎么查自己名下有没有注册公司

视频网站开发者工具,怎么查自己名下有没有注册公司,优化seo教程,付费阅读wordpress欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab#xff0c;机器人运动控制、多机器人协作#xff0c;智能优化算法#xff0c;滤波估计、多传感器信息融合#xff0c;机器学习#xff0c;人工智能等相关领域的知识和… 欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab机器人运动控制、多机器人协作智能优化算法滤波估计、多传感器信息融合机器学习人工智能等相关领域的知识和技术。 IO多路转接技术 —— poll/epoll详解 1. poll详解2. epoll详解1API介绍2epoll树3epoll模型4epoll的三种工作模式5文件描述符1024限制 图书推荐 -《构建高性能嵌入式系统》 重磅福利 本次送1本书 评论区抽1位小伙伴送书 活动时间截止到 2023-11-30 10:00:00 抽奖方式评论区随机抽奖。 参与方式关注博主、点赞、收藏评论。 ❗注意一定要关注博主不然中奖后将无效 通知方式通过私信联系中奖粉丝。 提示有任何疑问请私信公粽号 《机器和智能》 专栏《Linux从小白到大神》《网络编程》 1. poll详解 函数原型 int poll(struct pollfd *fd, nfds_t nfds, int timeout);函数参数 fd数组的地址struct pollfd all[120]; 其中struct pollfd结构体如下 struct pollfd {int fd; /* 文件描述符 */short events; /* 等待的事件 */short revents; /* 实际发生的事件 */ };结构体红各项含义如下 文件描述符fd表示要坚持测的fd通过 open(“a.txt”, O_wronly | O_append); 获得。 events要等待的事件 revents实际发生的事件它是内核给的反馈在select的时候会有一个备份来供内核修改并传出。 nfds数组的最大长度, 数组中最后一个使用的元素下标1 内核会轮询检测fd数组的每个文件描述符 timeout: -1永久阻塞0调用完成立即返回0等待的时长毫秒 函数返回值IO发生变化的文件描述符的个数。 2. epoll详解 1API介绍 int epoll_create(int size);函数功能生成一个epoll专用的文件描述符实际上就是生成一个epoll树的根结点。函数参数sizeepoll树上能挂的最大文件描述符数量。表示我想在这个树节点上挂size个节点假如实际上的节点大于size的话epoll会自动扩展所以这个大小可以随便传不用太在意。但是这个扩展也是有上限的如果电脑内存是1G那么扩展的上限是10万2G就是20万。。。通过加内存可以扩大上限。函数返回值函数返回值是树的根节点在后面用到epft参数的时候都是指这个返回值也就是树的根节点。 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);函数功能用于控制某个epoll文件描述符事件可以注册、修改、删除。 函数参数 epfdepoll_create()函数生成的专用文件描述符。 op EPOLL_CTL_ADD —— 注册EPOLL_CTL_MOD —— 修改EPOLL_CTL_DEL —— 删除 fd关联的文件描述符 event告诉内核要监听什么事件 EPOLLIN —— 读 EPOLLOUT —— 写 EPOLLERR —— 异常 struct epoll_event { /* 该结构体主要存放和fd有关的信息 */uint32_t events; epoll_data_t data; };typedef union epoll_data {void *ptr;int fd;uint32_t u32;uint64_t u64; } epoll_data_t;epoll_data_t是一个联合体union四个成员共用同一块内存也就是说四个成员我们只能用一个一般情况下我们用fd这个fd实际上就是epoll_ctl()函数的第三个参数fd。 如果我们想在epoll树上挂载更多信息而不仅仅是fd文件描述符的话我们可以把更多信息封装在结构体中并把该结构体传给epoll_data_t结构体的ptr指针这样就可以在epoll树上挂载和fd有关的更多信息。 struct sockInfo {int fd;struct sockaddr_in addr; };比如说要获取发生变化的fd对应的client的IP和port就可以利用指针ptr这样的话联合epoll_data_t中的fd就不能用了我们把文件描述符传给sockInfo的fd即可完成fd信息的挂载。 int epoll_wait(int epfd,struct epoll_event* events, /* 结构体数组 */int maxevents,int timeout);函数功能等待IO事件发生可以设置阻塞epoll_wait()函数相当于前面讲的select()或poll()函数表示委托内核去进行检测。epoll_event通过返回值和传出参数events来实现把哪几个fd发生变化告诉server进程的目的。首先每当有fd变化就把这个fd对应的树节点拷贝到events数组中最后有几个fd变化就返回几。这样只要根据返回值和参数events就可以遍历出所有变化的fd以及相关信息。 函数参数 epfd要检测的句柄 events用于回传待处理事件的数组。它是一个传出参数需要提前分配内存哪个fd发生变化了就把哪个fd的树节点(struct epoll_event)拷贝一份放到这个数组中。这样epoll就能返回是哪个fd发生了变化。 maxevents告诉内核events的大小因为内核要把发生变化的fd对应的树节点拷贝到数组中所以要知道数组大小。 timeout为超时时间 -1永久阻塞0立即返回0 函数返回值有多少个fd发生了变化就返回几变化的fd信息存在events数组中。 2epoll树 3epoll模型 #include stdio.h #include unistd.h #include stdlib.h #include sys/types.h #include string.h #include sys/socket.h #include arpa/inet.h #include ctype.h #include sys/epoll.hint main(int argc, const char* argv[]) {if(argc 2){printf(eg: ./a.out port\n);exit(1);}struct sockaddr_in serv_addr;socklen_t serv_len sizeof(serv_addr);int port atoi(argv[1]); //字符串转整形值// 创建套接字int lfd socket(AF_INET, SOCK_STREAM, 0);// 初始化服务器 sockaddr_in memset(serv_addr, 0, serv_len);serv_addr.sin_family AF_INET; // 地址族 serv_addr.sin_addr.s_addr htonl(INADDR_ANY); // 监听本机所有的IPserv_addr.sin_port htons(port); // 设置端口 // 绑定IP和端口bind(lfd, (struct sockaddr*)serv_addr, serv_len);// 设置同时监听的最大个数listen(lfd, 36);printf(Start accept ......\n);struct sockaddr_in client_addr;socklen_t cli_len sizeof(client_addr);// 创建epoll树根节点int epfd epoll_create(2000);// 初始化epoll树struct epoll_event ev;ev.events EPOLLIN;ev.data.fd lfd;epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, ev);//存放发生变化的fd对应的树节点struct epoll_event all[2000];while(1){// 使用epoll通知内核fd 文件IO检测int ret epoll_wait(epfd, all, sizeof(all)/sizeof(all[0]), -1);// 遍历all数组中的前ret个元素 //ret表示有几个变化的fd变化的fd都存在all数组中for(int i0; iret; i){int fd all[i].data.fd;// 判断是否有新连接if(fd lfd){// 接受连接请求 // accept不阻塞因为已经有连接int cfd accept(lfd, (struct sockaddr*)client_addr, cli_len);if(cfd -1){perror(accept error);exit(1);}// 将新得到的cfd挂到树上struct epoll_event temp;temp.events EPOLLIN; //检测cfd对应的读缓冲区是否有数据传入temp.data.fd cfd;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, temp);// 打印客户端信息char ip[64] {0};printf(New Client IP: %s, Port: %d\n,inet_ntop(AF_INET, client_addr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(client_addr.sin_port));}else{// 处理已经连接的客户端发送过来的数据if(!all[i].events EPOLLIN) //只处理读事件{continue;}/*假如说client发送过了100个数据也就是serve的read缓冲区有100个数据但是调用recv函数的时候只能读50个数据而本次循环只调用了一次recv那么只能下次循环再读剩余的50个数据所以下次循环检测的时候epoll_wait还是会返回因为缓冲区还是剩余数据。这就是水平触发模式。这样的话虽然client只发了1次但是epoll_wait会通知两次server去读数据。*/// 读数据char buf[1024] {0};int len recv(fd, buf, sizeof(buf), 0);if(len -1){perror(recv error);exit(1);}else if(len 0){printf(client disconnected ....\n);//close(fd);// fd从epoll树上删除ret epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);// 挂树的时候需要ev,把ev挂在树上删除写NULL就行了if(ret -1){perror(epoll_ctl del error);exit(1);}close(fd);}else{printf( recv buf: %s\n, buf);write(fd, buf, len);}}}}close(lfd);return 0; }epoll维护的红黑树是存在一个共享内存中内核和用户都可以通过操作这个共享内存来操作树不需要内核态和用户态的切换也不需要两种状态之间的数据拷贝所以效率更高。 4epoll的三种工作模式 水平触发模式 - 根据读来解释 只要fd对应的缓冲区有数据epoll_wait就会返回返回的次数与发送数据的次数没有关系epoll默认的工作模式 边沿触发模式 - ET fd - 默认阻塞属性 客户端给server发数据: 发一次数据server 的 epoll_wait就返回一次 不在乎数据是否读完 如果读不完如何把数据全部读出来? while(recv()); 数据读完之后recv会阻塞解决阻塞问题 —— 设置非阻塞fd 对于epoll_wait()来说epoll_wait 调用次数越多, 系统的开销越大。 水平触发模式会多次返回只要server的read缓冲区有数据epoll_wait就返回也就会通知server去读数据那么在循环检测的时候只要server的read缓冲区有数据epoll_wait就会多次调用多次返回并通知server去读数据假如说client发送过了100个数据也就是serve的read缓冲区有100个数据但是调用recv函数的时候只能读50个数据而本次循环只调用了一次recv那么只能下次循环再读剩余的50个数据所以下次循环检测的时候epoll_wait还是会返回因为缓冲区还是剩余数据。这就是水平触发模式。这样的话虽然client只发了1次但是epoll_wait会通知两次server去读数据。 —— printf函数是标准C库函数C库函数都有一个默认缓冲区printf的大小是8K。printf函数是行缓冲使用printf函数的时候如果不加 \n 会默认等到写满的时候才打印内容加 \n 会强制把缓冲区的内容打印出来。另外 \0 表示结束不加 \0 就会一直输出直到遇到 \0用write(STDOUT_FILENO)替代printf函数就可以解决这些问题。 边沿触发模式client发一次数据epoll_wait只返回一次也就只读一次这样的话server的read缓冲区可能会有很多数据堆积server读数据的时候可能读到的是上一次剩余的数据并且只有client发的时候epoll_wait才会通知server去读数据边沿触发模式尽可能减少了epoll_wait的调用次数缺点是数据有可能读不完导致堆积 边沿非阻塞触发 效率最高 如何设置非阻塞 open() 设置flags必须 O_WDRW | O_NONBLOCK终端文件: /dev/tty fcntl int flag fcntl(fd, F_GETFL);flag | O_NONBLOCK;fcntl(fd, F_SETFL, flag); 如何将缓冲区的全部数据都读出 while(recv() 0) { ​ printf(); } 当缓冲区数据读完之后, 返回值是否为0? 阻塞状态 数据读完之后recv阻塞 非阻塞状态 强行读了一个没有数据的缓冲区(fd)数据已经被读完了因为是非阻塞所以在while循环中recv还要继续读导致返回-1判断 errno EAGAIN 示例 #include stdio.h #include unistd.h #include stdlib.h #include sys/types.h #include string.h #include sys/socket.h #include arpa/inet.h #include ctype.h #include sys/epoll.h #include fcntl.h #include errno.hint main(int argc, const char* argv[]) {if(argc 2){printf(eg: ./a.out port\n);exit(1);}struct sockaddr_in serv_addr;socklen_t serv_len sizeof(serv_addr);int port atoi(argv[1]);// 创建套接字int lfd socket(AF_INET, SOCK_STREAM, 0);// 初始化服务器 sockaddr_in memset(serv_addr, 0, serv_len);serv_addr.sin_family AF_INET; // 地址族 serv_addr.sin_addr.s_addr htonl(INADDR_ANY); // 监听本机所有的IPserv_addr.sin_port htons(port); // 设置端口 // 绑定IP和端口bind(lfd, (struct sockaddr*)serv_addr, serv_len);// 设置同时监听的最大个数listen(lfd, 36);printf(Start accept ......\n);struct sockaddr_in client_addr;socklen_t cli_len sizeof(client_addr);// 创建epoll树根节点int epfd epoll_create(2000);// 初始化epoll树struct epoll_event ev;// 设置边沿触发ev.events EPOLLIN; //监听的文件描述符没必要边沿触发主要是通信的cfdev.data.fd lfd;epoll_ctl(epfd, EPOLL_CTL_ADD, lfd, ev);struct epoll_event all[2000];while(1){// 使用epoll通知内核fd 文件IO检测int ret epoll_wait(epfd, all, sizeof(all)/sizeof(all[0]), -1);printf( epoll_wait \n);// 遍历all数组中的前ret个元素for(int i0; iret; i){int fd all[i].data.fd;// 判断是否有新连接if(fd lfd){// 接受连接请求int cfd accept(lfd, (struct sockaddr*)client_addr, cli_len);if(cfd -1){perror(accept error);exit(1);}// 设置文件cfd为非阻塞模式int flag fcntl(cfd, F_GETFL);flag | O_NONBLOCK;fcntl(cfd, F_SETFL, flag);// 将新得到的cfd挂到树上struct epoll_event temp;// 设置边沿触发temp.events EPOLLIN | EPOLLET;temp.data.fd cfd;epoll_ctl(epfd, EPOLL_CTL_ADD, cfd, temp);// 打印客户端信息char ip[64] {0};printf(New Client IP: %s, Port: %d\n,inet_ntop(AF_INET, client_addr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(client_addr.sin_port));}else{// 处理已经连接的客户端发送过来的数据if(!all[i].events EPOLLIN) {continue;}// 读数据char buf[5] {0};int len;// 循环读数据while( (len recv(fd, buf, sizeof(buf), 0)) 0 ){// 数据打印到终端//不要用printf因为printf如果找不到 \0 \n 字符会出现乱码打印不出来等问题write(STDOUT_FILENO, buf, len);// 发送给客户端send(fd, buf, len, 0);}if(len 0){printf(客户端断开了连接\n);ret epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);if(ret -1){perror(epoll_ctl - del error);exit(1);}close(fd);}else if(len -1){//数据已经被读完了因为是非阻塞所以在while循环中recv还要继续读导致返回-1if(errno EAGAIN){printf(缓冲区数据已经读完\n);}else{//这才是真正的recv错误printf(recv error----\n);exit(1);}} #if 0if(len -1){perror(recv error);exit(1);}else if(len 0){printf(client disconnected ....\n);// fd从epoll树上删除ret epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);if(ret -1){perror(epoll_ctl - del error);exit(1);}close(fd);}else{// printf( recv buf: %s\n, buf);write(STDOUT_FILENO, buf, len);write(fd, buf, len);} #endif}}}close(lfd);return 0; }5文件描述符1024限制 对于select来说无法突破文件描述符1024上限因为select是通过数组实现的。poll和epoll可以突破1024限制poll是内部链表实现而epoll是红黑树实现。 查看受计算机硬件限制的文件描述符上限可以通过下面命令 cat /proc/sys/fs/file-max同样我们也可以通过修改配置文件来修改这个上限但是我们在程序中设置的时候不能超过硬件限制的上限 vim /etc/security/limits.confsoft nofile 8000 —— 也可以通过命令ulimit -n 2000来修改为2000 hard nofile 8000 —— 硬件资源限制 修改后重启系统即可起效。 图书推荐 -《构建高性能嵌入式系统》 购买链接点击购买-链接1 点击购买-链接2 内容简介 《构建高性能嵌入式系统》本书详细阐述了与构建高性能嵌入式系统相关的基本解决方案主要包括构建高性能嵌入式系统、传感器、实时操作、FPGA项目、KiCad设计电路、构建高性能数字电路、固件开发、测试和调试嵌入式系统等内容。此外本书还提供了相应的示例、代码以帮助读者进一步理解相关方案的实现过程。 前 言 用于家庭、汽车和个人的现代数字设备包含越来越复杂的计算能力。这些嵌入式系统以每秒数千兆位的速率生成、接收和处理数字数据流。本书将教你如何使用现场可编程门阵列Field Programmable Gate ArrayFPGA和高速数字电路设计技术来设计创建你自己的尖端数字设备。 本书读者 本书适用于软件开发人员、硬件工程师、物联网IoT开发人员以及其他任何寻求了解开发高性能嵌入式系统过程的人员。潜在受众包括有兴趣了解FPGA开发基础知识以及 C和C 固件开发所有方面的任何人。读者应当对C/C 语言、数字电路和焊接电子元件等有基本了解。 内容介绍 本书分为3篇共10章具体介绍如下。 第1篇高性能嵌入式系统的基础知识包括第13章。 第1章“高性能嵌入式系统”详细阐释了嵌入式系统架构的元素并讨论了在各种嵌入式应用中通用的一些关键系统特性。嵌入式系统通常包括至少一个微控制器或微处理器、传感器、执行器、电源在许多情况下还会有一个或多个网络接口。本章还深入探讨了嵌入式系统和物联网之间的关系。 第2章“感知世界”详细介绍了在各种嵌入式应用中使用的传感器的原理和实现。无源传感器可测量周围环境的属性如温度、压力、湿度、光强度和大气成分等。有源传感器则可以使用雷达和激光雷达等能量发射技术来探测物体并测量其位置和速度。此外本章还介绍了与传感器通信的接口。 第3章“实时操作”探讨了嵌入式系统对从传感器和其他来源测量的输入生成实时响应的需求介绍了实时操作系统RTOS的概念及其关键特性以及在实时应用程序中实现多任务处理时常见的一些挑战。此外本章还介绍了一些流行的开源和商业RTOS实现的重要特征。 第2篇设计和构建高性能嵌入式系统包括第47章。 第4章“开发你的个FPGA项目”首先讨论了实时嵌入式系统中 FPGA 设备的有效使用然后阐释了标准FPGA中包含的功能元素。本章介绍了一系列FPGA设计语言包括硬件描述语言hardware description languageHDL、原理图方法和流行的软件编程语言包括C和C 。本章介绍了FPGA开发过程并提供了一个FPGA开发周期的完整示例。 第5章“使用FPGA实现系统”深入探讨了使用FPGA设计和实现嵌入式设备的过程。本章首先介绍了FPGA编译软件工具和编译过程使用工具可将编程语言中的逻辑设计描述转换为可执行的FPGA配置。本章还讨论了适合FPGA实现的算法类型后还开发了一个基于FPGA的高速数字示波器基础项目。 第6章“使用KiCad设计电路”介绍了优秀的开源KiCad电子设计和自动化套件。在KiCad中工作可以使用原理图设计电路并开发相应的印刷电路板布局。你将了解如何以非常合理的成本将电路板设计转变为原型产品。 第7章“构建高性能数字电路”详细阐释了使用表面贴装和通孔电子元件组装高性能数字电路原型所涉及的过程和技术。本章介绍的电路板组装工具包括焊台、放大镜或显微镜以及用于处理微小零件的镊子等。此外本章还介绍了回流焊接工艺并描述了一些用于实现小规模回流能力的低成本选项。 第3篇实现和测试实时固件包括第810章。 第8章“首次给电路板通电”介绍了如何为电路板通电做准备。本章将引导你完成首次向电路板供电并检查基本电路级功能的过程。发现任何问题时可以按本章建议的方法调整电路。在测试通过之后还可以添加FPGA逻辑并测试示波器电路板的数字接口。 第9章“固件开发过程”演示了如何在电路板正常运行后充实FPGA算法的其余关键部分包括与模数转换器analog to digital converterADC的通信以及MicroBlaze处理器固件的开发。在开发固件时重要的是尽可能对代码进行静态分析这样可以避免许多难以调试的错误。实现版本控制系统以跟踪项目生命周期中代码的演变也很重要。本章讨论了开发一个全面的、至少部分自动化的测试套件对于在进行更改时保持代码质量的重要性。此外本章还着重介绍了编码风格。 第10章“测试和调试嵌入式系统”讨论了嵌入式系统的全面测试问题。系统级测试必须针对整个系统预期范围的环境条件和用户输入包括无效输入以确保系统在所有条件下都能正常运行。此外本章还讨论了有效调试技术总结了高性能嵌入式系统开发的实践。 充分利用本书 本书充分利用了强大的免费商业和开源软件工具套件来开发FPGA算法和设计复杂的印刷电路板。要跟随本书示例项目学习你需要一个特定的FPGA开发板Digilent Arty A7-100。要构建数字电路以实现你的设计你还需要一套用于焊接和拆焊表面贴装元件的工具。此外你可能还需要一些工具来协助处理精细元件如精密镊子、放大镜或显微镜等。
http://www.tj-hxxt.cn/news/143256.html

相关文章:

  • django商城网站开发的功能做外贸在那些网站找业务
  • 永久个人网站网络营销首先要做什么
  • 邯郸做网站xy0310aws个人免费版
  • 地情网站建设方案wordpress 数据表前缀
  • 网站开发资质要求网站建设添加文件夹在哪
  • 如何做好网站推广营销绍兴网站建设设计制作
  • 镇江住房和城乡建设局网站58同城遵义
  • 曲周网站建设营销数据网站
  • 做网站论坛 前置许可wordpress 自定义栏目 删除
  • 网站模板定做app开发定制的公司哪家好
  • 自己做网站排名产品经理网站开发需求
  • 山西住房和城乡建设厅网站工程机械网
  • 查看网站建设时间如何设计一个网页并举例说明
  • 购物网站界面 管理员需求分析网站开发需要的知识和技术
  • excel做网站链接自己制作app的应用程序
  • go语言做网站花店网站建设毕设介绍
  • 做2手车网站需要多少钱织梦txt网站地图制作
  • 怎么做音乐网站网站建设化妆品的目录
  • 一个网站有个前端后端怎么做seo网站自动发布外链工具
  • 做设计 素材网站有哪alexa排名全球前50网站
  • 在哪几个网站里可以做淘客河南第二建设集团有限公司网站
  • 网站手机版模板赣州章贡区二手房出售信息
  • 门户网站推广方式wordpress同步文章插件
  • 商场设计理念兰州官网seo诊断
  • 网站建设丿金手指下拉vps wordpress域名
  • 苏州高端网站设计百度联盟推广
  • 怎样做网站平台赚钱吗网站进行诊断
  • 在线网页下载网络营销推广及优化方案
  • 天猫入驻网站建设国外公司查询网站
  • 郑州网站微信微博维护建德网站建设