- 博客(26)
- 收藏
- 关注
原创 webserve项目C++问题总结
比如决定是否关闭 socket。使用同步 I/O 方式模拟出 Proactor 模式。原理是:主线程执行数据读写操作,读写完成之后,主线程向工作线程通知这一”完成事件“。那么从工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。使用同步 I/O 模型(以 epoll_wait为例)模拟出的 Proactor 模式的工作流程如下:1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。
2024-03-13 21:41:32 1144
原创 webserve(6) 超时时间
通过和addsig函数的配合使用,程序可以把信号异步地转发到主事件循环中处理,这是处理信号的一种更安全和更灵活的方法。在网络编程和多线程程序中,这种方法可以有效避免信号处理中的阻塞调用和不安全操作,同时简化信号与程序逻辑的集成。在Unix和类Unix操作系统中,当信号处理函数被执行时,可能会中断正常的系统调用。如果系统调用被信号打断,那么默认行为通常是让系统调用失败并返回-1,并且设置errno为EINTR(表示调用被中断)。
2024-03-07 21:13:53 931
原创 Webserve(5): main函数
在C和C++编程语言中,extern关键字用于声明一个变量或函数,表示其定义在另一个文件中。使用extern可以在多个文件之间共享变量或函数。extern的主要用途是声明一个在其他地方定义的全局变量或函数的引用,这对于跨文件访问和修改变量、调用函数特别有用。这种方式在大型项目中,特别是在需要将实现分散到多个文件中时,非常常见。
2024-03-06 09:57:46 457
原创 Webserve(4): HTTP解析
它依次调用其他几个方法来添加特定的头部信息,包括内容长度、内容类型、连接类型和一个空行,标志着头部结束,接下来是消息体。这个流程展示了处理HTTP请求的典型步骤:读取请求、解析请求、生成响应,并根据请求的处理结果调整socket的事件注册,以便继续进行数据的读取或写入。的值,它会设置适当的状态行(例如,"HTTP/1.1 404 Not Found")和响应的头部。总体而言,这些方法共同构成了HTTP响应消息的创建和发送过程的一部分,确保了响应格式符合HTTP/1.1协议的规范。在这个上下文中,它标志着。
2024-03-05 15:11:50 1254
原创 Webserve(3): HTTP解析
这个函数主要用于处理带有内容体的 HTTP 请求(例如 POST 请求),通过检查已接收数据的长度与标头指定的长度是否匹配来确定请求体是否完整。如果请求体接收完整,就准备好了进行后续的请求处理,比如解析请求体中的数据。这是处理 HTTP 请求的一个重要步骤,确保了服务器能够正确处理完整的请求数据。// 获取一行数据break;break;break;default: {这段代码是http_conn类的方法的实现,用于处理读取HTTP请求的整个过程。方法通过。
2024-03-04 21:22:15 2149 1
原创 Linux线程同步(3)生产者与消费者、条件变量与信号量
(Producer-Consumer)问题,是一个经典的问题。。;。生产者和消费者通常是的,即它们可能在不同的时间点执行。生产者可能会在生产数据后立即放入缓冲区,而消费者可能会在稍后的时间点从缓冲区中取出数据。因此,需要一种机制来,以确保缓冲区不会溢出(即生产者不会在缓冲区满时继续生产数据)或下溢(即消费者不会在缓冲区空时尝试取出数据)。生产者与消费者模型是一个经典的并发编程模型,用于解决多线程或进程间的数据共享和同步问题。。:负责生产数据,并将这些数据放入共享缓冲区中。
2024-02-24 12:14:40 869
原创 Linux线程同步(2)死锁与互斥锁
(Deadlock)是指两个或两个以上的进程(或线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(或线程)称为死锁进程(或线程)。如果上述四个条件同时成立,系统就可能发生死锁。操作系统层面的死锁最早在1965年由Dijkstra在研究银行家算法时提出,它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。
2024-02-23 22:28:39 1128 2
原创 Linux线程同步(1)概念与互斥量
在Linux中,是指的执行顺序,以确保它们。线程同步机制可以,避免竞态条件,以及保证程序的正确性和稳定性。首先举一个使用多线程实现售票的案例,有3个窗口在卖票,一共是100张票。运行结果如图所示,出现了一些问题:首先,出现多个线程同时售卖同一张票的情况,如第12张;此外还有一种情况就是说会出现卖第0张甚至是-1张票的情况。
2024-02-23 21:18:43 916
原创 Linux多线程开发
与进程(process)类似,线程(thread)是允许应用程序多个任务的一种机制。同一个程序中的所有线程均会独立执行相同程序,且同一份全局内存区域,其中包括初始化数据段、未初始化数据段,以及堆内存段。(LWP: Light Weight Process),在Linux环境下,线程的本质仍然是进程。
2023-12-22 22:15:05 892
原创 共享内存实现进程间通信
共享内存允许两个或者多个进程共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会成为一个进程用户空间的一部分,因此这种进程间通信机制需要内核介入的次数很少。所有需要做的就是让一个进程将数据复制到共享内存中,并且这部分的数据对其他所有共享同一段的进程可用。与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种IPC 技术的速度更快。(1)调用shmget()函数创建一个新的共享内存段或者取得一个已经存在的共享内存段的标识符(由其他进
2023-12-21 22:06:10 1277
原创 使用SIGCHLD信号解决僵尸进程
以上三种条件都会给父进程发送SIGCHLD信号,父进程默认会忽略掉这个信号。那么怎么样去用这个信号解决僵尸进程呢?既然子进程终止会产生这个SIGCHLD信号,那么在父进程中捕捉这个信号,然后回收子进程的资源。在上述代码中:首先通过创建了20个子进程。
2023-12-21 17:20:26 470
原创 Linux中的alarm和setitimer定时器函数以及信号捕捉函数signal和sigaction
signal() sets the disposition of the signal signum to handler, which is either SIG_IGN, SIG_DFL, or the address of a programmer-defined function (a "signal handler"). (将信号signum的处置设置为handler,它可以是。
2023-12-19 22:01:16 2429
原创 Linux中的信号以及与信号相关的系统调用
是通信的最古老的方式之一,是事件发生时对进程的,有时也称之为,它是在软件层次上对的一种,是一种的方式。信号可以导致一个正在运行的进程被另外一个正在运行的异步进程中断,转而处理某一个突发事件。发往进程的诸多信号,通常都。引发系统内核为进程的有:(1)对于前台进程(可以理解为在当前终端运行的进程,此时当前终端无法输入其他命令),用户可以通过输入特殊的终端字符来给这个进程发送信号。比如,通常会给进程发送一个。(2),即硬件检测到一个错误条件并通知内核,随即再由内核发送相关信号给相关进程。
2023-12-19 16:33:17 984
原创 内存映射(Memory-mapped I/O)实现进程间通信和文件拷贝
内存映射(Memory-mapped I/O)是将中的数据中,用户通过修改内存就能够修改磁盘文件。使用实现进程之间的通信,1和2表示进程的,这两个进程与同一个磁盘文件建立联系既可以实现两个进程之间的通信。
2023-12-17 17:05:10 1331
原创 有名管道实现简单版聊天
在chatA和chatB中,读和写管道不放在同一个进程中。因为放在同一个进程中,必定有一个是阻塞的,也就是说你不能在写的同时读数据,也不能在读数据的同时写数据。因此创建一个子进程,父子进行分别实现读和写。,比如B在发送 i am b之后再发送数据A是收不到的。原因是,B是在不停地读和写,那么B写完之后,下一次是该读了,但是A并没有发送过来数据,所以。同理B可以不断发送,A可以不断接收。开始写入数据,注意,这个程序只能。这样的话,就可以实现收发多次了。A进程代码:chatA.c。B进程代码:chatB.c。
2023-12-16 20:46:07 428
原创 平均数为k的最长连续子数组C++实现
题目描述:给定n个正整数组成的数组,求平均数正好等于 k 的最长连续子数组的长度。如果不存在任何一个连续子数组的平均数等于k,则输出-1。否则输出平均数正好等于k的最长连续子数组的长度。第一行输入两个正整数n和k,用空格隔开。例子说明:取前三个数即可,平均数为2。第二行输入n个正整数。
2023-11-23 22:10:48 1105
原创 使用C++实现LRU缓存机制,并解决可能存在的内存泄漏问题
在析构函数中,你可以删除双向链表中的节点,以及删除哈希表中的键值对,并释放由于创建LRUCache对象而分配的内存。销毁对象并释放内存。在构造函数中new了两个双向链表的节点,在结束时这两个new出来的对象要删除,并且创建的双向链表要删除,哈希表也要清空。在上述代码中的主函数中,最终使用了delete来销毁对象并释放内存,为了避免忘记这一步操作,可以使用智能指针(例如。这样,当包含它的类对象被创建时,包含的类对象也会被创建。这是最常见的方式,可以通过直接声明对象来创建,对象的生命周期在当前作用域内。
2023-11-02 22:39:59 284
原创 修改mmdetection预训练模型权重的类别数,以Pascal VOC为例
修改mmdetection预训练模型权重的类别数,以Pascal VOC为例
2022-11-22 17:20:35 2168 1
翻译 Carla核心概念1:客户端
世界与客户端是CARLA的两个基本要素,是操作模拟器及其参与者的必要抽象。一、client客户端是用户运行以请求模拟中的信息或更改的模块。客户端使用IP和特定端口运行,通过终端与服务器进行通信。可以同时运行多个客户端。高级的多客户端管理需要彻底理解CARLA和同步。客户端是CARLA体系结构中的主要元素之一。它们通过脚本连接到服务器、检索信息和命令更改。客户端识别自己,并与世界连接,然后与模拟操作。除此之外,客户端还可以访问高级CARLA模块、特性,并应用命令批量。本节将只讨论命令批量。这对
2022-03-13 20:29:17 828
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人