<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[鹏鱼彦的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_45586192</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_45586192]]></copyright><item><title><![CDATA[深入理解计算机系统记录]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/147231593</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/147231593</guid><author>qq_45586192</author><pubDate>Mon, 14 Apr 2025 19:58:21 +0800</pubDate><description><![CDATA[Struct 为每个成员分配独立内存，总大小为各成员大小之和（加上对齐填充）。Union 所有成员共享内存，总大小为最大成员大小。Struct 可以同时存储多个数据项；Union 同一时刻只能存储一个数据项。因此，根据你的具体需求选择使用结构体还是联合体。需要同时存储所有字段信息时使用结构体，需要节省内存或需要按照不同数据类型解释资源时使用联合体。]]></description><category></category></item><item><title><![CDATA[webserve项目C++问题总结]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136672983</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136672983</guid><author>qq_45586192</author><pubDate>Wed, 13 Mar 2024 21:41:32 +0800</pubDate><description><![CDATA[比如决定是否关闭 socket。使用同步 I/O 方式模拟出 Proactor 模式。原理是：主线程执行数据读写操作，读写完成之后，主线程向工作线程通知这一”完成事件“。那么从工作线程的角度来看，它们就直接获得了数据读写的结果，接下来要做的只是对读写的结果进行逻辑处理。使用同步 I/O 模型（以 epoll_wait为例）模拟出的 Proactor 模式的工作流程如下：1. 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。]]></description><category></category></item><item><title><![CDATA[webserve(6) 超时时间]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136535654</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136535654</guid><author>qq_45586192</author><pubDate>Thu, 07 Mar 2024 21:13:53 +0800</pubDate><description><![CDATA[通过和addsig函数的配合使用，程序可以把信号异步地转发到主事件循环中处理，这是处理信号的一种更安全和更灵活的方法。在网络编程和多线程程序中，这种方法可以有效避免信号处理中的阻塞调用和不安全操作，同时简化信号与程序逻辑的集成。在Unix和类Unix操作系统中，当信号处理函数被执行时，可能会中断正常的系统调用。如果系统调用被信号打断，那么默认行为通常是让系统调用失败并返回-1，并且设置errno为EINTR（表示调用被中断）。]]></description><category></category></item><item><title><![CDATA[Webserve(5): main函数]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136479758</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136479758</guid><author>qq_45586192</author><pubDate>Wed, 06 Mar 2024 09:57:46 +0800</pubDate><description><![CDATA[在C和C++编程语言中，extern关键字用于声明一个变量或函数，表示其定义在另一个文件中。使用extern可以在多个文件之间共享变量或函数。extern的主要用途是声明一个在其他地方定义的全局变量或函数的引用，这对于跨文件访问和修改变量、调用函数特别有用。这种方式在大型项目中，特别是在需要将实现分散到多个文件中时，非常常见。]]></description><category></category></item><item><title><![CDATA[Webserve(4): HTTP解析]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136463581</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136463581</guid><author>qq_45586192</author><pubDate>Tue, 05 Mar 2024 15:11:50 +0800</pubDate><description><![CDATA[它依次调用其他几个方法来添加特定的头部信息，包括内容长度、内容类型、连接类型和一个空行，标志着头部结束，接下来是消息体。这个流程展示了处理HTTP请求的典型步骤：读取请求、解析请求、生成响应，并根据请求的处理结果调整socket的事件注册，以便继续进行数据的读取或写入。的值，它会设置适当的状态行（例如，"HTTP/1.1 404 Not Found"）和响应的头部。总体而言，这些方法共同构成了HTTP响应消息的创建和发送过程的一部分，确保了响应格式符合HTTP/1.1协议的规范。在这个上下文中，它标志着。]]></description><category></category></item><item><title><![CDATA[Webserve(3): HTTP解析]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136447935</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136447935</guid><author>qq_45586192</author><pubDate>Mon, 04 Mar 2024 21:22:15 +0800</pubDate><description><![CDATA[这个函数主要用于处理带有内容体的 HTTP 请求（例如 POST 请求），通过检查已接收数据的长度与标头指定的长度是否匹配来确定请求体是否完整。如果请求体接收完整，就准备好了进行后续的请求处理，比如解析请求体中的数据。这是处理 HTTP 请求的一个重要步骤，确保了服务器能够正确处理完整的请求数据。// 获取一行数据break;break;break;default: {这段代码是http_conn类的方法的实现，用于处理读取HTTP请求的整个过程。方法通过。]]></description><category></category></item><item><title><![CDATA[Webserve(2): HTTP解析]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136432634</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136432634</guid><author>qq_45586192</author><pubDate>Mon, 04 Mar 2024 11:35:35 +0800</pubDate><description><![CDATA[这样，]]></description><category></category></item><item><title><![CDATA[Webserver(1): C++实现线程池]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136426868</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136426868</guid><author>qq_45586192</author><pubDate>Sun, 03 Mar 2024 11:45:36 +0800</pubDate><description><![CDATA[在实现线程池之前，首先对线程池中所需要用到的互斥锁、条件变量和信号量进行了简单的封装。]]></description><category></category></item><item><title><![CDATA[Linux线程同步（3）生产者与消费者、条件变量与信号量]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136269465</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136269465</guid><author>qq_45586192</author><pubDate>Sat, 24 Feb 2024 12:14:40 +0800</pubDate><description><![CDATA[（Producer-Consumer）问题，是一个经典的问题。。；。生产者和消费者通常是的，即它们可能在不同的时间点执行。生产者可能会在生产数据后立即放入缓冲区，而消费者可能会在稍后的时间点从缓冲区中取出数据。因此，需要一种机制来，以确保缓冲区不会溢出（即生产者不会在缓冲区满时继续生产数据）或下溢（即消费者不会在缓冲区空时尝试取出数据）。生产者与消费者模型是一个经典的并发编程模型，用于解决多线程或进程间的数据共享和同步问题。。：负责生产数据，并将这些数据放入共享缓冲区中。]]></description><category></category></item><item><title><![CDATA[Linux线程同步（2）死锁与互斥锁]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136264370</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136264370</guid><author>qq_45586192</author><pubDate>Fri, 23 Feb 2024 22:28:39 +0800</pubDate><description><![CDATA[（Deadlock）是指两个或两个以上的进程（或线程）在执行过程中，由于竞争资源或者由于彼此通信而造成的一种阻塞的现象，若无外力作用，它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁，这些永远在互相等待的进程（或线程）称为死锁进程（或线程）。如果上述四个条件同时成立，系统就可能发生死锁。操作系统层面的死锁最早在1965年由Dijkstra在研究银行家算法时提出，它是计算机操作系统乃至整个并发程序设计领域最难处理的问题之一。]]></description><category></category></item><item><title><![CDATA[Linux线程同步（1）概念与互斥量]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/136263258</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/136263258</guid><author>qq_45586192</author><pubDate>Fri, 23 Feb 2024 21:18:43 +0800</pubDate><description><![CDATA[在Linux中，是指的执行顺序，以确保它们。线程同步机制可以，避免竞态条件，以及保证程序的正确性和稳定性。首先举一个使用多线程实现售票的案例，有3个窗口在卖票，一共是100张票。运行结果如图所示，出现了一些问题：首先，出现多个线程同时售卖同一张票的情况，如第12张；此外还有一种情况就是说会出现卖第0张甚至是-1张票的情况。]]></description><category></category></item><item><title><![CDATA[Linux多线程开发]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135160753</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135160753</guid><author>qq_45586192</author><pubDate>Fri, 22 Dec 2023 22:15:05 +0800</pubDate><description><![CDATA[与进程（process）类似，线程（thread）是允许应用程序多个任务的一种机制。同一个程序中的所有线程均会独立执行相同程序，且同一份全局内存区域，其中包括初始化数据段、未初始化数据段，以及堆内存段。（LWP: Light Weight Process）,在Linux环境下，线程的本质仍然是进程。]]></description><category></category></item><item><title><![CDATA[守护进程介绍]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135149827</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135149827</guid><author>qq_45586192</author><pubDate>Fri, 22 Dec 2023 16:50:06 +0800</pubDate><description><![CDATA[在介绍守护进程之前，需要了解一些概念，比如终端、进程组和会话。]]></description><category></category></item><item><title><![CDATA[共享内存实现进程间通信]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135140030</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135140030</guid><author>qq_45586192</author><pubDate>Thu, 21 Dec 2023 22:06:10 +0800</pubDate><description><![CDATA[共享内存允许两个或者多个进程共享物理内存的同一块区域（通常被称为段）。由于一个共享内存段会成为一个进程用户空间的一部分，因此这种进程间通信机制需要内核介入的次数很少。所有需要做的就是让一个进程将数据复制到共享内存中，并且这部分的数据对其他所有共享同一段的进程可用。与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比，这种IPC 技术的速度更快。（1）调用shmget()函数创建一个新的共享内存段或者取得一个已经存在的共享内存段的标识符（由其他进]]></description><category></category></item><item><title><![CDATA[使用SIGCHLD信号解决僵尸进程]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135132282</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135132282</guid><author>qq_45586192</author><pubDate>Thu, 21 Dec 2023 17:20:26 +0800</pubDate><description><![CDATA[以上三种条件都会给父进程发送SIGCHLD信号，父进程默认会忽略掉这个信号。那么怎么样去用这个信号解决僵尸进程呢？既然子进程终止会产生这个SIGCHLD信号，那么在父进程中捕捉这个信号，然后回收子进程的资源。在上述代码中：首先通过创建了20个子进程。]]></description><category></category></item><item><title><![CDATA[Linux中的信号集以及与信号集相关的函数]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135104610</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135104610</guid><author>qq_45586192</author><pubDate>Wed, 20 Dec 2023 21:39:57 +0800</pubDate><description><![CDATA[进行操作。也就是说，在调用这些函数之前，需要先定义一个。]]></description><category></category></item><item><title><![CDATA[Linux中的alarm和setitimer定时器函数以及信号捕捉函数signal和sigaction]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135091220</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135091220</guid><author>qq_45586192</author><pubDate>Tue, 19 Dec 2023 22:01:16 +0800</pubDate><description><![CDATA[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，它可以是。]]></description><category></category></item><item><title><![CDATA[Linux中的信号以及与信号相关的系统调用]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135086045</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135086045</guid><author>qq_45586192</author><pubDate>Tue, 19 Dec 2023 16:33:17 +0800</pubDate><description><![CDATA[是通信的最古老的方式之一，是事件发生时对进程的，有时也称之为，它是在软件层次上对的一种，是一种的方式。信号可以导致一个正在运行的进程被另外一个正在运行的异步进程中断，转而处理某一个突发事件。发往进程的诸多信号，通常都。引发系统内核为进程的有：（1）对于前台进程（可以理解为在当前终端运行的进程，此时当前终端无法输入其他命令），用户可以通过输入特殊的终端字符来给这个进程发送信号。比如，通常会给进程发送一个。（2），即硬件检测到一个错误条件并通知内核，随即再由内核发送相关信号给相关进程。]]></description><category></category></item><item><title><![CDATA[内存映射（Memory-mapped I/O）实现进程间通信和文件拷贝]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/134599168</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/134599168</guid><author>qq_45586192</author><pubDate>Sun, 17 Dec 2023 17:05:10 +0800</pubDate><description><![CDATA[内存映射（Memory-mapped I/O）是将中的数据中，用户通过修改内存就能够修改磁盘文件。使用实现进程之间的通信，1和2表示进程的，这两个进程与同一个磁盘文件建立联系既可以实现两个进程之间的通信。]]></description><category></category></item><item><title><![CDATA[有名管道实现简单版聊天]]></title><link>https://blog.youkuaiyun.com/qq_45586192/article/details/135032947</link><guid>https://blog.youkuaiyun.com/qq_45586192/article/details/135032947</guid><author>qq_45586192</author><pubDate>Sat, 16 Dec 2023 20:46:07 +0800</pubDate><description><![CDATA[在chatA和chatB中，读和写管道不放在同一个进程中。因为放在同一个进程中，必定有一个是阻塞的，也就是说你不能在写的同时读数据，也不能在读数据的同时写数据。因此创建一个子进程，父子进行分别实现读和写。，比如B在发送 i am b之后再发送数据A是收不到的。原因是，B是在不停地读和写，那么B写完之后，下一次是该读了，但是A并没有发送过来数据，所以。同理B可以不断发送，A可以不断接收。开始写入数据，注意，这个程序只能。这样的话，就可以实现收发多次了。A进程代码：chatA.c。B进程代码：chatB.c。]]></description><category></category></item></channel></rss>