网络-多路io

了 fcntl 函数来操作文件描述符的状态标志,其中主要是为了设置非阻塞模式。下面是对 fcntl 函数及其参数的详细解释:

fcntl 函数

fcntl 是一个用于操作文件描述符的系统调用,可以用来设置或获取文件描述符的各种属性。其原型如下:

int fcntl(int fd, int cmd, ... /* arg */ );

  • fd: 需要操作的文件描述符。
  • cmd: 操作类型(命令),指定要执行的操作。
  • arg: 额外参数,根据 cmd 的不同可能需要。

参数解释

F_GETFL 和 F_SETFL
  • F_GETFL: 获取文件描述符的当前状态标志。这个命令将返回文件描述符的当前状态标志。
  • F_SETFL: 设置文件描述符的状态标志。这个命令将文件描述符的状态标志设置为指定的值。
代码分析
int flag = fcntl(fd_r, F_GETFL);
fcntl(fd_r, F_SETFL, flag | O_NONBLOCK);

  1. int flag = fcntl(fd_r, F_GETFL);

    • 获取文件描述符 fd_r 的当前状态标志,并存储在变量 flag 中。
    • F_GETFL 命令返回的状态标志包括文件描述符的访问模式(如读、写)和一些状态标志(如是否为非阻塞模式)。
  2. fcntl(fd_r, F_SETFL, flag | O_NONBLOCK);

    • 使用 F_SETFL 命令设置文件描述符 fd_r 的状态标志。
    • flag | O_NONBLOCK 表示将 O_NONBLOCK 标志添加到当前状态标志中。
    • O_NONBLOCK 是一个标志,用于设置文件描述符为非阻塞模式。非阻塞模式意味着读写操作不会阻塞进程,如果无法立即完成操作,系统调用会立即返回,而不是等待。
flag = fcntl(0, F_GETFL);
fcntl(0, F_SETFL, flag | O_NONBLOCK);

  1. flag = fcntl(0, F_GETFL);

    • 获取标准输入(文件描述符 0)的当前状态标志,并存储在变量 flag 中。
  2. fcntl(0, F_SETFL, flag | O_NONBLOCK);

    • 使用 F_SETFL 命令设置标准输入的状态标志。
    • flag | O_NONBLOCK 表示将 O_NONBLOCK 标志添加到标准输入的当前状态标志中。
    • 这将把标准输入设置为非阻塞模式,使得读取标准输入的操作不会阻塞进程。

总结

  • fcntl(fd_r, F_GETFL) 用于获取文件描述符 fd_r 的当前状态标志。
  • fcntl(fd_r, F_SETFL, flag | O_NONBLOCK) 用于将 fd_r 的状态标志设置为非阻塞模式,确保对 fd_r 的读写操作不会阻塞。
  • 同样,fcntl(0, F_GETFL) 和 fcntl(0, F_SETFL, flag | O_NONBLOCK) 将标准输入(文件描述符 0)设置为非阻塞模式,使得读取标准输入的操作也是非阻塞的。

通过这些设置,你可以确保读写操作在没有数据时不会导致程序阻塞,从而使程序能够在执行其他任务时保持响应。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>int main(int argc, char *argv[])
{int ret = mkfifo("myfifo1",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}int fd_r = open("myfifo1",O_RDONLY);if(-1 == fd_r){perror("open");return 1;}int flag = fcntl(fd_r,F_GETFL);fcntl(fd_r,F_SETFL,flag|O_NONBLOCK);flag = fcntl( 0,F_GETFL);fcntl(0,F_SETFL,flag|O_NONBLOCK);while(1){char buf[128]={0};if(read(fd_r,buf,sizeof(buf))>0){printf("fifo:%s\n",buf);}bzero(buf,sizeof(buf));if(fgets(buf,sizeof(buf),stdin)){printf("terminal:%s\n",buf);}}return 0;
}

signal函数在多路io

演示了如何使用信号驱动 I/O(SIGIO)来处理命名管道(FIFO)的异步事件。下面是对代码及各个函数的作用的详细解释:

代码解析

1. #include 和 全局变量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>int fd_r;

  • #include:引入了必要的头文件,提供了函数原型和常量定义。
  • fd_r:定义一个全局变量,用于存储打开的 FIFO 文件描述符。
2. handle 函数
void handle(int num)
{char buf[128]={0};read(fd_r,buf,sizeof(buf));printf("fifo:%s\n",buf);return ;
}

  • handle:信号处理函数,当收到 SIGIO 信号时被调用。
    • num:传递给信号处理函数的信号编号,这里没有用到。
    • read(fd_r, buf, sizeof(buf)):从 FIFO 中读取数据到 buf
    • printf("fifo:%s\n", buf):打印读取到的数据。
3. main 函数
int main(int argc, char *argv[])
{signal(SIGIO, handle);

  • signal(SIGIO, handle):设置信号处理函数,当进程接收到 SIGIO 信号时,会调用 handle 函数。
    int ret = mkfifo("myfifo1",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}

  • mkfifo("myfifo1", 0666):创建一个名为 "myfifo1" 的 FIFO(命名管道)。如果文件已存在 (EEXIST),则不处理错误。
    fd_r = open("myfifo1", O_RDONLY);if(-1 == fd_r){perror("open");return 1;}

  • open("myfifo1", O_RDONLY):以只读模式打开 FIFO,并将文件描述符存储在 fd_r 中。如果打开失败,打印错误信息并退出。
    int flag = fcntl(fd_r, F_GETFL);fcntl(fd_r, F_SETFL, flag | O_ASYNC);

  • fcntl(fd_r, F_GETFL):获取当前文件描述符的状态标志。
  • fcntl(fd_r, F_SETFL, flag | O_ASYNC):设置文件描述符为异步模式 (O_ASYNC)。这意味着当文件描述符有数据可读时,会向进程发送 SIGIO 信号。
    fcntl(fd_r, F_SETOWN, getpid());

  • fcntl(fd_r, F_SETOWN, getpid()):设置 fd_r 文件描述符的信号所有者为当前进程(getpid())。这使得 SIGIO 信号会发送到当前进程。
    while(1){char buf[128]={0};bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);printf("terminal:%s\n", buf);}return 0;
}

  • 无限循环
    • fgets(buf, sizeof(buf), stdin):从标准输入读取数据到 buf
    • printf("terminal:%s\n", buf):打印从标准输入读取的数据。

主要函数的作用

  1. signal(SIGIO, handle)

    • 用于设置进程在接收到 SIGIO 信号时调用 handle 函数。
  2. mkfifo("myfifo1", 0666)

    • 创建一个命名管道(FIFO)。如果已存在,则不处理错误。
  3. open("myfifo1", O_RDONLY)

    • 打开创建的 FIFO 文件,以只读模式获取文件描述符。
  4. fcntl(fd_r, F_GETFL) 和 fcntl(fd_r, F_SETFL, flag | O_ASYNC)

    • 获取和设置文件描述符的状态标志,使其处于异步模式。异步模式会使文件描述符触发信号(SIGIO),当数据到达时通知进程。
  5. fcntl(fd_r, F_SETOWN, getpid())

    • 设置文件描述符 fd_r 的信号所有者为当前进程,使得 SIGIO 信号会发送到当前进程。
  6. read(fd_r, buf, sizeof(buf))

    • 在信号处理函数中,从 FIFO 中读取数据。
  7. fgets(buf, sizeof(buf), stdin) 和 printf("terminal:%s\n", buf)

    • 在主循环中,读取标准输入的数据并打印。

总结

这段代码通过设置文件描述符 fd_r 为异步模式,并为其指定信号所有者,使得当有数据可读时会发送 SIGIO 信号。信号处理函数 handle 会在收到 SIGIO 时被调用,从 FIFO 中读取数据并打印。这种方式允许进程在等待数据的同时执行其他操作,比如读取标准输入。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
int fd_r;
void handle(int num)
{char buf[128]={0};read(fd_r,buf,sizeof(buf));printf("fifo:%s\n",buf);return ;
}
int main(int argc, char *argv[])
{signal(SIGIO,handle);int ret = mkfifo("myfifo1",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}fd_r = open("myfifo1",O_RDONLY);if(-1 == fd_r){perror("open");return 1;}//给管道设置信号驱动int flag = fcntl(fd_r,F_GETFL);fcntl(fd_r,F_SETFL,flag| O_ASYNC);//如果有写管道,本进程作为sigio信号的接收者fcntl(fd_r,F_SETOWN,getpid());while(1){char buf[128]={0};bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);printf("terminal:%s\n",buf);}return 0;
}

select 函数用于监视多个文件描述符的状态,以便在其中一个或多个文件描述符变为可读、可写或出现异常时进行处理。下面是对 select 相关函数和操作的详细解释。

select 函数

select 函数用于监视文件描述符集合,以确定哪些文件描述符在某个时间点是就绪的(即,可以进行读、写操作或出现异常)。其原型如下:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

  • nfds: 文件描述符的数量+1。它通常是你感兴趣的最大文件描述符值加1。
  • readfds: 监视的文件描述符集合(用于读操作)。
  • writefds: 监视的文件描述符集合(用于写操作)。
  • exceptfds: 监视的文件描述符集合(用于异常条件)。
  • timeout: 指定 select 函数的超时时间。如果超时时间为 NULL,则 select 将无限期等待直到有文件描述符变为可用。

fd_set 操作函数

  • FD_ZERO(fd_set *set): 清空文件描述符集合 set
  • FD_SET(int fd, fd_set *set): 将文件描述符 fd 添加到文件描述符集合 set 中。
  • FD_CLR(int fd, fd_set *set): 从文件描述符集合 set 中移除文件描述符 fd
  • FD_ISSET(int fd, fd_set *set): 检查文件描述符 fd 是否在文件描述符集合 set 中。

代码分析

// 1. 创建文件描述符集合
fd_set rd_set, tmp_set; // 读集合
FD_ZERO(&rd_set);       // 清空读集合
FD_ZERO(&tmp_set);      // 清空临时集合// 2. 添加文件描述符
FD_SET(0, &tmp_set);    // 将标准输入(文件描述符 0)添加到临时集合
FD_SET(fd_r, &tmp_set); // 将文件描述符 fd_r 添加到临时集合while (1) {// 6. 复制临时集合到读集合rd_set = tmp_set;char buf[128] = {0};// 3. 等待事件发生select(fd_r + 1, &rd_set, NULL, NULL, NULL);// 4. 查找发生事件的文件描述符if (FD_ISSET(fd_r, &rd_set)) {read(fd_r, buf, sizeof(buf));printf("fifo: %s\n", buf);}if (FD_ISSET(0, &rd_set)) {bzero(buf, sizeof(buf));fgets(buf, sizeof(buf), stdin);printf("terminal: %s\n", buf);}
}

  1. 创建文件描述符集合

    • fd_set rd_set, tmp_set; 定义了两个 fd_set 类型的变量,用于存储文件描述符集合。
    • FD_ZERO(&rd_set); 清空 rd_set 集合。
    • FD_ZERO(&tmp_set); 清空 tmp_set 集合。
  2. 添加文件描述符

    • FD_SET(0, &tmp_set); 将标准输入(文件描述符 0)添加到 tmp_set 集合中。
    • FD_SET(fd_r, &tmp_set); 将文件描述符 fd_r 添加到 tmp_set 集合中。
  3. 等待事件

    • rd_set = tmp_set; 复制 tmp_set 到 rd_setrd_set 用于 select 调用,避免在 select 调用后丢失对文件描述符的跟踪。
    • select(fd_r + 1, &rd_set, NULL, NULL, NULL); 等待直到 fd_r 或标准输入有数据可读。fd_r + 1 是需要监视的文件描述符的数量加1。
  4. 处理事件

    • FD_ISSET(fd_r, &rd_set) 检查 fd_r 是否在 rd_set 中,即检查 fd_r 是否有数据可读。如果有,读取数据并打印。
    • FD_ISSET(0, &rd_set) 检查标准输入是否在 rd_set 中,即检查标准输入是否有数据可读。如果有,读取数据并打印。

总结

  • select 用于监视多个文件描述符,以确定哪些文件描述符准备好进行读、写或异常处理。
  • fd_set 操作函数用于创建和修改文件描述符集合。
  • 在代码中,select 被用于等待标准输入或文件描述符 fd_r 中有数据可读,并根据文件描述符的状态执行相应的读取操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char *argv[])
{int ret = mkfifo("myfifo1",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}int fd_r = open("myfifo1",O_RDONLY);if(-1 == fd_r){perror("open");return 1;}//1 create set fd_set rd_set,tmp_set; //read set FD_ZERO(&rd_set);FD_ZERO(&tmp_set);// 2. add fd FD_SET(0,&tmp_set);FD_SET(fd_r,&tmp_set);while(1){//6.clean flagrd_set = tmp_set;char buf[128]={0};//3 wait event select(fd_r+1,&rd_set,NULL,NULL,NULL );//4 找到对应的fdif(FD_ISSET(fd_r,&rd_set)){read(fd_r,buf,sizeof(buf));printf("fifo:%s\n",buf);}if(FD_ISSET(0,&rd_set)){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);printf("terminal:%s\n",buf);}}return 0;
}

epoll

epoll 被用来实现对两个文件描述符的事件通知机制。下面是对各个函数和操作的详细分析:

1. add_fd(int epfd, int fd)

这个函数用于将一个文件描述符 fd 添加到 epoll 实例 epfd 中,并指定感兴趣的事件类型。

  • 参数
    • epfdepoll_create 创建的 epoll 文件描述符。
    • fd:要添加到 epoll 的文件描述符。
  • 操作
    • 创建一个 epoll_event 结构体 ev,设置感兴趣的事件为 EPOLLIN,表示关注该文件描述符的可读事件。
    • 使用 epoll_ctl 函数将 fd 添加到 epoll 实例中,操作类型为 EPOLL_CTL_ADD
  • 返回值
    • 返回 epoll_ctl 的结果,如果返回 -1 表示添加失败,并调用 perror 打印错误信息。

2. main(int argc, char *argv[])

主函数的执行流程:

  1. 创建命名管道(FIFO)

    • 使用 mkfifo 创建两个命名管道 "myfifo1" 和 "myfifo2",这两个管道用于进程间通信。如果创建失败并且错误码不是 EEXIST(文件已存在),则打印错误信息并退出。
  2. 打开命名管道

    • 使用 open 打开 myfifo1(以只读模式)和 myfifo2(以只写模式),分别获得 fd_r 和 fd_w 文件描述符。如果打开失败,打印错误信息并退出。
  3. 创建 epoll 实例

    • 使用 epoll_create 创建一个 epoll 实例,并返回一个文件描述符 epfd。如果创建失败,打印错误信息并退出。
  4. 添加文件描述符到 epoll 实例

    • 调用 add_fd 函数将标准输入(文件描述符 0)和管道 myfifo1 的文件描述符 fd_r 添加到 epoll 实例中,开始监听它们的事件。
  5. 事件监听循环

    • 进入无限循环,调用 epoll_wait 等待事件发生。epoll_wait 会阻塞直到有事件发生,或者超时(这里设置为 -1,表示无限等待)。

    • 事件处理

      • 如果 epoll_wait 返回有事件发生,遍历所有的事件:
        • 如果事件的文件描述符是标准输入(0),读取输入数据并写入到 fd_w,如果输入为 "#quit\n",则退出程序。
        • 如果事件的文件描述符是 fd_r,从 fd_r 读取数据并打印。如果读取的数据是 "#quit\n" 或读取失败,则退出程序。

主要函数和操作的作用总结

  1. epoll_create:创建 epoll 实例,返回 epoll 文件描述符。此文件描述符用于后续的 epoll_ctl 和 epoll_wait 操作。

  2. epoll_ctl:对 epoll 实例进行控制操作,如添加、修改或删除文件描述符及其事件。此处用于将文件描述符添加到 epoll 实例中。

  3. epoll_wait:等待 epoll 实例中的文件描述符发生事件。阻塞直到有文件描述符的事件发生或者超时,返回发生的事件数量。

  4. fgets 和 write:用于从标准输入读取数据,并写入到 fd_w 对应的管道中。

  5. read 和 printf:用于从 fd_r 对应的管道中读取数据,并输出到标准输出。

这段代码展示了如何使用 epoll 机制来处理异步 I/O 操作,同时实现了基于命名管道的进程间通信。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <sys/epoll.h>int add_fd(int epfd,int fd)
{struct epoll_event ev;ev.events = EPOLLIN;ev.data.fd = fd;int ret = epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&ev);if(-1==ret){perror("add_fd");}return ret;
}int main(int argc, char *argv[])
{int ret = mkfifo("myfifo1",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}ret = mkfifo("myfifo2",0666);if(-1 == ret){if( EEXIST!= errno ){perror("mkfifo");return 1;}}int fd_r = open("myfifo1",O_RDONLY);if(-1 == fd_r){perror("open");return 1;}int fd_w = open("myfifo2",O_WRONLY);if(-1 == fd_w){perror("open");return 1;}struct epoll_event rev[2];int epfd;int ep_ret;epfd = epoll_create(2);if(-1==epfd){perror("epoll_create");return 1;}add_fd(epfd,0);add_fd(epfd,fd_r);while(1) {ep_ret = epoll_wait(epfd,rev,2,-1);if(ep_ret>0){int i=0;for(i=0;i<ep_ret;i++){if(0==rev[i].data.fd){printf("to A:");char buf[128]={0};fgets(buf,sizeof(buf),stdin);//#quitif(0 == strcmp(buf,"#quit\n")){exit(0);}write(fd_w,buf,strlen(buf));}else if(fd_r==rev[i].data.fd){char buf[128]={0};int ret = read(fd_r,buf,sizeof(buf));if(0==strcmp(buf,"#quit\n") || ret<=0){exit(0);}printf("from A:%s",buf);fflush(stdout);}}}}return 0;
}

第一步 创建epoll_create

第二步  添加成员

第三步  epoll_wait()

有timeout的使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51854.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu Linux Server安装Kubernetes

本文主要描述在Ubuntu Linux Server操作系统中安装Kubernetes云原生对应的microk8s组件。 sudo snap install microk8s --classic 如上所示&#xff0c;在Ubuntu服务器中安装microk8s组件完成&#xff0c;对应的版本是microk8s v1.30版本 microk8s enable dashboard 如上所…

华为云征文|基于Flexus云服务器X实例的应用场景-定时给微信群中推送新闻简报

&#x1f534;大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 先看这里 写在前面效果华为云Flexus X实例服务器部署开源的热点新闻项目ssh连接服务器docker部署今日热点项目访问今日热点项目 搭建微信交互工具获取token创建发送的公共方法…

【Spring】获取cookie,session,header(3)

本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。 目录 本系列共涉及4个框架&#xff1a;Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点&#xff0c;根据序号学习即可。…

Linux主机网络参数的设置—IP地址的作用和类型

网络参数管理 一.网络参数 主机名&#xff0c;IP地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS服务器地址 1.配置主机名 hostname命令来查看当前系统的主机名&#xff0c; hosnamectl set-hostname 修改centos7的主机名&#xff0c; 建议以FQDN的&#xff…

惠中科技光伏清洗剂:点亮绿色能源未来

在当今全球追求可持续发展的时代&#xff0c;光伏产业作为清洁能源的重要代表&#xff0c;正发挥着日益关键的作用。而在光伏产业的高效运行中&#xff0c;惠中科技的光伏清洗剂犹如一颗璀璨的明珠&#xff0c;为光伏板的清洁与维护贡献着卓越力量。 一、光伏产业的挑战与需求…

STM32嵌入式面试知识点总结

一、STM32F1和F4的区别&#xff1f; 解答&#xff1a; 参看&#xff1a;STM32开发 – STM32初识内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b;主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b;浮点运算&#xff1a;…

【C++ Primer Plus习题】8.3

问题: 解答: #include <iostream> #include <string> #include <cctype> using namespace std;void function(string& str) {for (int i 0; i < str.size(); i){str[i]toupper(str[i]);} }int main() {string str;while (true){cout << "…

od机试题目

od试题 日志采集TLV 日志采集 思路&#xff1a; 处理输入&#xff1a; Scanner 拿到整个输入 放入string[] 按照" "分隔 调用Integer.parseInt 将string转int类型 解题&#xff1a; 用一个变量count记录当前日志数量&#xff0c;初始为输入的第一个参数 用一个max变…

Java中类的成员介绍

我的后端学习大纲 我的Java学习大纲 4.类的成员&#xff1a; 3.1.类的成员 -> 属性介绍&#xff08;成员变量&#xff09;&#xff1a; a.语法格式&#xff1a; 1.修饰符 数据类型 属性名 初始化值 ;2.说明1: 修饰符 常用的权限修饰符有&#xff1a;private、缺省、prot…

网络原理 - 初识

文章目录 局域网(LAN)广域网(WAN)网络设备IP地址格式 端口号格式 认识网络协议协议分层 OSI七层模型(只是理论,没有实际运用)TCP/IP五层&#xff08;或四层&#xff09;模型网络设备所在分层 封装和分用 计算机之间通过网络来传输数据&#xff0c;也称为网络通信。 根据网络互连…

linux系统编程:数据库

1. 数组、链表、变量-----》内存&#xff1a;程序运行结束、掉电数据丢失 文件----------------------》硬盘&#xff1a;程序运行结束、掉电数据不丢失 数据库&#xff1a; 专业存储数据、大量数据-----》硬盘 sqlite相关的命令 .tables 查看…

库克库伯防爆电容器会起火吗

库克库伯&#xff08;Cooke Colb&#xff09;防爆电容器设计用于在具有爆炸性气体或粉尘的危险环境中安全运行。尽管这些防爆电容器经过严格的设计和测试&#xff0c;能够保障不会出现爆炸现象&#xff0c;以确保在恶劣环境中运行时的安全性&#xff0c;但在某些极端情况下&…

[数据集][目标检测]电力场景输电线均压环歪斜检测数据集VOC+YOLO格式303张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;303 标注数量(xml文件个数)&#xff1a;303 标注数量(txt文件个数)&#xff1a;303 标注类别…

【网络安全】Instagram 和 Meta 2FA 绕过漏洞

未经许可,不得转载。 文章目录 漏洞概述技术细节Meta 2FA 绕过步骤Instagram 2FA 绕过步骤总结漏洞概述 该漏洞允许攻击者在具有受害者Facabook账户权限的情况下,绕过 Meta 的双重身份验证 (2FA) 机制,实现账户接管;并且也能够绕过 Instagram 的双重身份验证 (2FA) 机制,…

【GeoScenePro】Generic Server Error

错误 解决方案 在portal中进行知识图谱许可授权

国密起步5:GmSSL3交叉编译arm64

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 之前已经建立好了交叉编译环境…

视频集中存储智能边缘计算网关软硬一体机智能边缘计算网关应用场景

在信息化飞速发展的今天&#xff0c;数据处理的速度和效率直接影响到各行各业的运作和发展。传统的云计算模式虽然强大&#xff0c;但在面对实时性和带宽要求越来越高的应用场景时&#xff0c;往往显得力不从心。此时&#xff0c;智能边缘计算网关的出现&#xff0c;为我们带来…

sqli-labs靶场(56-60)

56关 ?id-1)union select 1,2,database()-- 看数据库 ?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- 看表 ?id-1) union select 1,group_concat(column_name),3 from information_schema.columns wh…

深入探索MySQL数据库结构设计:实战案例解析,打造高效、可扩展的数据存储方案

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a; 云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 前言&#xff1a;…

noge-gyp构建项目踩坑记录

开发环境 系统: win11 node: 19.7.0 npm: 8.3.2 node-gyp: 10.0.2可以不使用windows-build-tools来安装构建工具,手动进行安装 我这边用windows-build-tools安装时候会提示 process.env only accepts a configurable, writable, and enumerable data descriptor. 查了资料后…