<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[button__c的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/button__c</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; button__c]]></copyright><item><title><![CDATA[【Linux】线程同步：条件不满足时，线程该怎么等]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168973739</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168973739</guid><author>button__c</author><pubDate>Sat, 24 Oct 2026 15:40:49 +0800</pubDate><description><![CDATA[互斥保证安全，同步保证秩序，条件变量则把"条件不满足就挂起、条件满足就唤醒"这件事标准化成了 wait 和 signal 两个动作。光有这两件工具还不够：多个线程一读一写，到底该怎么组织？下一篇我们用生产者消费者模型把这一切整合到一起，并给出可以直接跑的完整代码。]]></description><category></category></item><item><title><![CDATA[【Linux】线程互斥：多线程改同一个变量，到底会出什么问题]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168973686</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168973686</guid><author>button__c</author><pubDate>Sat, 24 Oct 2026 15:37:44 +0800</pubDate><description><![CDATA[这一篇我们从抢票的 bug 出发，弄清了两件事：为什么不加保护的全局变量不安全（减减和判断都不是原子的），以及互斥锁是怎么解决问题的（用一条交换指令把锁的申请变成原子操作，让临界区从并行变串行）。不过纯互斥只解决了"对不对"的问题，没解决"好不好"的问题——一个线程如果反复申请释放锁却不干正事，其他线程可能饿死。下一篇我们讲线程同步，看看条件变量怎么让线程们按秩序排队。]]></description><category></category></item><item><title><![CDATA[【Linux】线程（下）：怎么创建、终止与分离一个线程]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168658179</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168658179</guid><author>button__c</author><pubDate>Wed, 21 Oct 2026 17:08:36 +0800</pubDate><description><![CDATA[到这里，线程的两篇就写完了。回顾一下：上篇讲的是线程的概念——Linux 用进程模拟线程，资源划分本质是划分页表；这一篇讲的是线程的控制——pthread 库在用户层把轻量级进程封装成线程，管理块、独立栈、clone 联动，构成了完整的用户级线程体系。你会发现之前学的进程知识在这里几乎全部复用了：fopen 的思想、PCB 的管理思路、僵尸进程的等待问题，换了个名字又出现了一遍。下一篇我们进入线程的重点话题：多个线程共享数据之后，怎么保证它们不打架——线程同步和互斥。]]></description><category></category></item><item><title><![CDATA[【Linux】线程（上）：进程里面还能再“分”出执行流吗]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168557777</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168557777</guid><author>button__c</author><pubDate>Tue, 20 Oct 2026 18:00:23 +0800</pubDate><description><![CDATA[先从教材定义来看。进程 = 内核数据结构 + 自己的代码和数据（执行流）；线程，则是进程内部的一个执行分支（执行流）。再换个角度：从内核和资源的角度看，进程是承担分配系统资源的基本实体——不管是内核数据结构还是代码和数据，都要占据内存资源、CPU 资源，所以进程一定要消耗系统的资源；而线程，是 CPU 调度的基本单位。这两个定义放在一起就很有意思了：资源分配的时候，我们以进程为单位来分；真正上 CPU 跑的时候，调度的是线程。也就是说，一个进程内部是允许多条执行流存在的，它们共同瓜分这个进程拿到的资源。]]></description><category></category></item><item><title><![CDATA[【Linux】信号（下）：进程是怎么“处理”信号的]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168557196</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168557196</guid><author>button__c</author><pubDate>Tue, 20 Oct 2026 17:31:24 +0800</pubDate><description><![CDATA[两篇合起来，信号的全貌就完整了：产生端五种方式殊途同归，落到 pending 位图；保存靠 pending、block、handler 三张表；处理则卡在内核态返回用户态的那个检查点上，先查 pending 再查 block，默认和忽略内核顺手就办了，自定义捕捉要回到用户态执行，一来一回正好四次身份切换。而为了讲清“凭什么进内核”，我们又把硬件中断、中断向量表、时钟源、系统调用号这条线走了一遍——操作系统的本质就是一个死循环，躺在中断处理例程上，被时钟源推着走。]]></description><category></category></item><item><title><![CDATA[【Linux】信号（上）：一个进程是怎么“被通知”的]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168145202</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168145202</guid><author>button__c</author><pubDate>Fri, 16 Oct 2026 22:32:23 +0800</pubDate><description><![CDATA[信号是一种给进程发送的，用来进行事件异步通知的机制。异步的意思是同一时间两件事情同时发生，互不干扰，就好比人正在睡觉，闹钟也正在慢慢走，两者各干各的，直到闹钟响了再通知起床；信号的产生，相对于进程的运行就是异步的。关于信号，先给四条基本结论：1、信号处理，进程在信号没有产生的时候，早就知道信号该如何处理了；2、信号的处理，不是立即处理，而是可以等一会再处理，在合适的时候进行信号的处理；3、进程能识别信号，是提前被“教育过的”，操作系统程序员设计的进程，早就已经内置了对于信号的识别和处理方式；]]></description><category></category></item><item><title><![CDATA[【力扣刷题】第五天：将 x 减到 0 的最小操作数、最大连续1的个数 III]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/168144142</link><guid>https://blog.youkuaiyun.com/button__c/article/details/168144142</guid><author>button__c</author><pubDate>Fri, 16 Oct 2026 22:29:25 +0800</pubDate><description><![CDATA[系列专栏直达链接🐧 Linux🔤 C语言🔧 C++🐬 MySQL🧩 算法刷题。]]></description><category></category></item><item><title><![CDATA[【力扣刷题】第四天：三数之和、四数之和]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/167916064</link><guid>https://blog.youkuaiyun.com/button__c/article/details/167916064</guid><author>button__c</author><pubDate>Wed, 14 Oct 2026 16:53:00 +0800</pubDate><description><![CDATA[最近因为一些原因托更了好久的算法博客，从今天开始我会慢慢补上来。今天的题目是三数之和、四数之和。]]></description><category></category></item><item><title><![CDATA[【Linux】进程间通信：两个互相看不见的进程，怎么看到同一份资源]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/167915597</link><guid>https://blog.youkuaiyun.com/button__c/article/details/167915597</guid><author>button__c</author><pubDate>Wed, 14 Oct 2026 15:29:43 +0800</pubDate><description><![CDATA[这节课我们学习了进程间通信的几种方式，从最古老的管道，到 System V 标准的共享内存与信号量，它们看似各不相同，但本质上都在回答同一个问题——怎么让两个互相看不见的进程，看到同一份资源。匿名管道靠继承，命名管道靠同一个路径，共享内存靠把两块虚拟地址映射到同一块物理内存上，而信号量则在这之上补了一层对资源数量的管理。如果有哪里讲得不清楚，也欢迎各位大佬在评论区指正，我们一起把这些底层的东西啃透。]]></description><category></category></item><item><title><![CDATA[【Linux】揭开文件系统神秘的面纱：第四讲：可执行文件的组装车间]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/167802564</link><guid>https://blog.youkuaiyun.com/button__c/article/details/167802564</guid><author>button__c</author><pubDate>Tue, 13 Oct 2026 13:55:48 +0800</pubDate><description><![CDATA[我们平时写代码，几乎都离不开printfstrlen这些函数，可它们并不在我们自己写的源文件里，那它们是从哪来的呢？它们来自库。库是写好的、现有的、成熟的、可以复用的代码，现实里每个程序都要依赖很多基础的底层库，不可能每个人的代码都从零开始，所以库的存在意义非同寻常。本质上来说，库是一种可执行代码的二进制形式，可以被操作系统载入内存执行，而库又分两种：静态库和动态库，这两种我们后面分别来看先看静态库。静态库本质就是打了包的.o文件，打包用的命令是ar -rc，也就是归档，把一堆.o。]]></description><category></category></item><item><title><![CDATA[【Linux】揭开文件系统神秘的面纱：第三讲：磁盘是怎么记住每一个文件的]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/167695891</link><guid>https://blog.youkuaiyun.com/button__c/article/details/167695891</guid><author>button__c</author><pubDate>Mon, 12 Oct 2026 15:24:19 +0800</pubDate><description><![CDATA[这一篇我们从磁盘的盘面、磁道一路讲到了inode和软硬连接，整条线可以拆成三件事：磁盘负责存，文件系统负责组织，目录负责记名字以后我会继续创作 Linux 方向的博客，如果觉得有帮助的话，希望各位大佬能三联关注支持一下，看到后我会进行回关和回访。]]></description><category></category></item><item><title><![CDATA[【Linux】揭开文件神秘的面纱：第二讲，操作系统自己的菜鸟驿站——文件缓冲区]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/166138491</link><guid>https://blog.youkuaiyun.com/button__c/article/details/166138491</guid><author>button__c</author><pubDate>Sun, 20 Sep 2026 19:18:56 +0800</pubDate><description><![CDATA[这节课带大家学习了有关文件缓冲区的知识，还有理解了一切皆文件到底是怎么实现的，希望大家在看完这篇文章后能从中学到新知识。以后我会继续创作Linux方向的博客，如果觉得有帮助的话希望各位大佬能三联关注支持一下，看到后我会进行回关和回访。]]></description><category></category></item><item><title><![CDATA[【Linux】将进程知识与基础IO融会贯通——简单自定义Shell的实现]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/166093473</link><guid>https://blog.youkuaiyun.com/button__c/article/details/166093473</guid><author>button__c</author><pubDate>Sun, 20 Sep 2026 16:35:21 +0800</pubDate><description><![CDATA[至此，我们的简单的自定义shell就写完了，虽然它和我们平常用的shell还有不小的区别，但是以我们目前学习的知识只能写成这样了，编写这个程序的目的也不是要完全还原shell的所有功能，而是利用这么一种方式来让大家能够更好的掌握之前学习的知识，希望大家在看完这篇文章后能更好的掌握这一部分的知识。if(pwd!g_argc--;else。]]></description><category></category></item><item><title><![CDATA[【力扣刷题】第三天：有效三角形的个数、快乐数]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/166008834</link><guid>https://blog.youkuaiyun.com/button__c/article/details/166008834</guid><author>button__c</author><pubDate>Sat, 19 Sep 2026 16:26:27 +0800</pubDate><description><![CDATA[原题。]]></description><category></category></item><item><title><![CDATA[【Linux】揭开文件神秘的面纱：第一讲，重定向背后的秘密]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/166002859</link><guid>https://blog.youkuaiyun.com/button__c/article/details/166002859</guid><author>button__c</author><pubDate>Sat, 19 Sep 2026 15:22:17 +0800</pubDate><description><![CDATA[这节课我们完成了对Linux中文件的初步认识，了解了重定向的基本原理，虽然这篇文章的主要篇幅不在讲解重定向上，但是通过上文的铺垫，相信大家在学习重定向相关知识时非常容易理解，这就是为什么我要花这么多的篇幅用于讲解其他知识的原因，希望这篇文章能让大家对文件系统和重定向操作有了更深的认识。]]></description><category></category></item><item><title><![CDATA[【C++】C++11的魔法：不止右值引用，C++11赋予的编程神力]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/165724412</link><guid>https://blog.youkuaiyun.com/button__c/article/details/165724412</guid><author>button__c</author><pubDate>Thu, 17 Sep 2026 14:20:39 +0800</pubDate><description><![CDATA[这节课我们完成了对C++11剩余知识的学习，还剩下一个智能指针我们下一篇文章再进行讲解。不得不说C++11不愧是C++最重大的一次更新，很多新内容都非常的有用，设计也十分巧妙，学会熟练使用C++11的内容可以让我们的代码水平更上一层楼。]]></description><category></category></item><item><title><![CDATA[【力扣刷题】第二天：无重复字符的最长字串、移动零问题]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/165591685</link><guid>https://blog.youkuaiyun.com/button__c/article/details/165591685</guid><author>button__c</author><pubDate>Wed, 16 Sep 2026 10:55:34 +0800</pubDate><description><![CDATA[原题。按照惯例，先来讲解一下我的错误思路，大家引以为鉴。我最初的思路是利用哈希表，从头到尾遍历一遍字符串，每遍历一个字母，就在哈希表内查找是否有重复，若无重复就插入哈希表，如果重复，就先将当前的字符个数插入红黑树中，再清空哈希表，从当前字符开始继续遍历。遍历结束后，根据红黑树的有序性，就可以得到最长字符串的长度。但是后来我发现一个问题，就是每次一遇到重复字符就清空哈希表的话，很容易导致原本可以更长的字符串因为将之前的字符都清空了导致实际长度不够，而且这么写也过于复杂了，所以最后还是采取了标准写法。]]></description><category></category></item><item><title><![CDATA[【Linux】一篇文章带你吃透进程控制：fork、wait、exit到底在做什么]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/165484536</link><guid>https://blog.youkuaiyun.com/button__c/article/details/165484536</guid><author>button__c</author><pubDate>Wed, 16 Sep 2026 10:08:01 +0800</pubDate><description><![CDATA[本文梳理了Linux进程控制四大核心：进程创建、进程退出、进程等待与程序替换。进程退出标记生命周期结束，wait/waitpid用于回收子进程，避免僵尸进程；exec系列系统调用实现程序替换，在保留进程资源的前提下加载新程序。理解这套机制，能看清进程从创建到消亡的完整流程，也是操作系统并发编程的重要基础。]]></description><category></category></item><item><title><![CDATA[【C++】C++11到底新增了什么？一篇文章带你搞懂列表初始化、右值引用和移动语义]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/165306247</link><guid>https://blog.youkuaiyun.com/button__c/article/details/165306247</guid><author>button__c</author><pubDate>Mon, 14 Sep 2026 15:36:56 +0800</pubDate><description><![CDATA[这篇文章带大家了解了C++11中新增的部分内容，主要就是列表初始化，右值引用以及配套的使用场景和移动语义，希望能帮助大家理解。]]></description><category></category></item><item><title><![CDATA[【MySQL】一篇文章带你了解MySQL基础知识、库/表操作和数据类型]]></title><link>https://blog.youkuaiyun.com/button__c/article/details/165197836</link><guid>https://blog.youkuaiyun.com/button__c/article/details/165197836</guid><author>button__c</author><pubDate>Sun, 13 Sep 2026 15:46:00 +0800</pubDate><description><![CDATA[数据库简单来说就是用来一个用来存储数据的仓库，它的底层也是目录和文件。此时就有了一个疑问：文件已经有了存储文件的能力，为什么还要数据库呢？一般的文件确实提供了数据的存储功能，但是文件并没有提供非常好的数据管理能力，我们对于存储数据不仅仅要求其能存起来，还要能帮我们管理，方便以后的增删查改。文件保存数据有以下几个缺点：1、文件的安全性问题。2、文件不利于数据查询和管理。3、文件不利于海量存储数据。4、文件在程序中控制不方便。]]></description><category></category></item></channel></rss>