<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CS on 我的笔记</title><link>http://note.leabol.top/categories/cs/</link><description>Recent content in CS on 我的笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://note.leabol.top/categories/cs/index.xml" rel="self" type="application/rss+xml"/><item><title>Makefile 的基本概念</title><link>http://note.leabol.top/posts/makefile/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/makefile/</guid><description>&lt;p>&lt;strong>Makefile&lt;/strong> 是 make 工具的配置文件，主要用于定义如何构建和管理项目的编译过程。Makefile 是 C/C++ 编译项目中的重要工具，尤其在多文件、多模块的项目中，为了方便复杂项目的管理，可以通过自动化规则提高编译效率。&lt;/p>
&lt;p>这篇文章是 Makefile 的入门教程的介绍，包括其基本语法、常用功能、以及实际使用中的高级技巧。&lt;/p>
&lt;h3 id="makefile-的基本概念">Makefile 的基本概念&lt;/h3>
&lt;p>安装 &lt;code>make&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo apt-get update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt-get install make
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="核心功能">核心功能&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://zhida.zhihu.com/search?content_id=707902769&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E8%87%AA%E5%8A%A8%E5%8C%96%E7%BC%96%E8%AF%91&amp;amp;zhida_source=entity">自动化编译&lt;/a>：根据文件的依赖关系自动决定哪些文件需要重新编译。&lt;/li>
&lt;li>提高效率：只编译发生变化的部分。&lt;/li>
&lt;li>&lt;a href="https://zhida.zhihu.com/search?content_id=707902769&amp;amp;content_type=Answer&amp;amp;match_order=1&amp;amp;q=%E5%A4%9A%E4%BB%BB%E5%8A%A1%E6%94%AF%E6%8C%81&amp;amp;zhida_source=entity">多任务支持&lt;/a>：可以定义清理、打包、测试等任务。&lt;/li>
&lt;/ul>
&lt;h3 id="使用方法">使用方法&lt;/h3>
&lt;p>运行&lt;code>make&lt;/code>命令时，默认会读取当前目录下的&lt;strong>Makefile 文件&lt;/strong>。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make &lt;span style="color:#75715e"># 执行默认的目标&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make &amp;lt;target&amp;gt; &lt;span style="color:#75715e"># 执行指定的目标&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>make clean &lt;span style="color:#75715e"># 执行 &amp;#34;clean&amp;#34; 目标&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="makefile-的基本语法">Makefile 的基本语法&lt;/h3>
&lt;h3 id="1-目标语法">1. 目标语法&lt;/h3>
&lt;p>&lt;strong>Makefile&lt;/strong> 的基本语法如下：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>target: prerequisites
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> commands
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>&lt;strong>target&lt;/strong>：目标文件或命令名称。例如可执行文件、目标文件或任务名称。&lt;/li>
&lt;li>&lt;strong>prerequisites&lt;/strong>：依赖文件或其他目标。只有依赖文件发生变化时，target 才会被重新生成。&lt;/li>
&lt;li>&lt;strong>commands&lt;/strong>：生成目标的命令（必须以 &lt;strong>Tab&lt;/strong> 开头）。&lt;/li>
&lt;/ul>
&lt;p>示例：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>hello: hello.o
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gcc -o hello hello.o
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hello.o: hello.c
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> gcc -c hello.c
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在示例代码中：&lt;/p></description></item><item><title>一些网站</title><link>http://note.leabol.top/posts/%E4%B8%80%E4%BA%9B%E7%BD%91%E7%AB%99/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E4%B8%80%E4%BA%9B%E7%BD%91%E7%AB%99/</guid><description>&lt;p>&lt;a href="https://www.ruanyifeng.com/blog/2010/10/why_lisp_is_superior.html">为什么Lisp语言如此先进?&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://norvig.com/">一个前辈的官网&lt;/a>&lt;/p></description></item><item><title>网络协议栈（Network）</title><link>http://note.leabol.top/posts/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88network-stack/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE%E6%A0%88network-stack/</guid><description>&lt;p>现代操作系统的内核（如 Linux 内核）中有一个专门的模块叫做：&lt;/p>
&lt;h1 id="网络协议栈network-stack">网络协议栈（Network Stack)&lt;/h1>
&lt;h2 id="主要职责详解">主要职责详解&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>职责&lt;/th>
&lt;th style="text-align: left">类比说明&lt;/th>
&lt;th>技术术语&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;strong>1. 接收和发送数据包&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司前台接收快递 &amp;amp; 发送包裹&lt;/td>
&lt;td>数据链路层、IP 层、传输层&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>2. IP 地址管理&lt;/strong>&lt;/td>
&lt;td style="text-align: left">给每个员工分配邮箱地址&lt;/td>
&lt;td>IPv4 / IPv6 地址配置&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>3. 路由选择&lt;/strong>&lt;/td>
&lt;td style="text-align: left">快递要走哪条路线最短最快&lt;/td>
&lt;td>路由表（Routing Table）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>4. 封装与解封装&lt;/strong>&lt;/td>
&lt;td style="text-align: left">包裹加标签 / 拆标签&lt;/td>
&lt;td>数据封装（Encapsulation）与解封装（Decapsulation）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>5. 传输控制（TCP）&lt;/strong>&lt;/td>
&lt;td style="text-align: left">控制文件是否完整送达&lt;/td>
&lt;td>TCP 流量控制、拥塞控制&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>6. 端口号管理&lt;/strong>&lt;/td>
&lt;td style="text-align: left">不同部门接收不同类型的快递&lt;/td>
&lt;td>端口绑定、监听、转发&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>7. 安全防护（防火墙）&lt;/strong>&lt;/td>
&lt;td style="text-align: left">保安检查包裹内容&lt;/td>
&lt;td>Netfilter / iptables / nftables&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>8. NAT 转换&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司统一出口代理&lt;/td>
&lt;td>Network Address Translation&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>9. 域名解析支持&lt;/strong>&lt;/td>
&lt;td style="text-align: left">内部电话簿查询联系方式&lt;/td>
&lt;td>DNS 解析缓存、本地 hosts&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;strong>10. 支持多种协议&lt;/strong>&lt;/td>
&lt;td style="text-align: left">公司支持各种沟通方式（电话、邮件、视频会议）&lt;/td>
&lt;td>支持 TCP、UDP、ICMP、HTTP、HTTPS、FTP 等&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="类比图操作系统网络部门的组织架构">类比图：操作系统网络部门的组织架构&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>小组&lt;/th>
&lt;th>类比角色&lt;/th>
&lt;th>职责&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>套接字接口组（Socket Layer）&lt;/td>
&lt;td>客户接待员&lt;/td>
&lt;td>接收进程请求（如浏览器访问网页）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>传输组（TCP / UDP）&lt;/td>
&lt;td>快递打包组&lt;/td>
&lt;td>控制可靠传输或快速发送&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>网络组（IP 层）&lt;/td>
&lt;td>邮政分拣中心&lt;/td>
&lt;td>决定发往哪个城市（IP 地址）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>链路组（MAC 层）&lt;/td>
&lt;td>快递站&lt;/td>
&lt;td>决定发给哪个局域网内的目标主机&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>路由组（Routing）&lt;/td>
&lt;td>导航调度中心&lt;/td>
&lt;td>选择最优路径（下一跳）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>设备驱动组（NIC Driver）&lt;/td>
&lt;td>快递员&lt;/td>
&lt;td>实际把包裹送出去（通过网卡）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>安全组（Netfilter / Firewall）&lt;/td>
&lt;td>保安检查岗&lt;/td>
&lt;td>检查是否允许通行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>NAT 组&lt;/td>
&lt;td>公司代理出口&lt;/td>
&lt;td>统一管理内部员工对外通信&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>DNS 缓存组&lt;/td>
&lt;td>内部电话簿管理员&lt;/td>
&lt;td>记录域名与 IP 的对应关系&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>Linux 的网络部分是一个庞大的子系统，主要包括以下几个关键模块：&lt;/p></description></item><item><title>编程的一些问题</title><link>http://note.leabol.top/posts/%E7%BC%96%E7%A8%8B%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://note.leabol.top/posts/%E7%BC%96%E7%A8%8B%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</guid><description>&lt;ul>
&lt;li>char类型与int一样,也可以存储数字,不过只能存一个字节,多于一个字节的数,只取最右边的; 用&amp;rsquo; &amp;lsquo;括起来的数字,相当于ascll中的字符, 值大小等于ascll值. 例如 &amp;lsquo;5&amp;rsquo; == (int) 53 。 当要将整型数字赋值给char字符串时， 要用&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>str[i] &lt;span style="color:#f92672">=&lt;/span>number &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#39;0&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>或者用&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">sprintf&lt;/span>(str&lt;span style="color:#f92672">*&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;%d&amp;#34;&lt;/span>, number); &lt;span style="color:#75715e">//sprintf 函数
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>数组初始化{0}时，并不是全赋值为零，而是&amp;rsquo;\0&amp;rsquo;，而但他是ascll的第0位，所以%d输入时为0；但用%c时不会输出&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-c" data-lang="c">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">char&lt;/span> &lt;span style="color:#f92672">*&lt;/span> p &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;abc&amp;#34;&lt;/span>;&lt;span style="color:#75715e">//abc是常量,p指向&amp;#34;abc&amp;#34;,不能更改
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">char&lt;/span> arr[] &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;abc&amp;#34;&lt;/span>;&lt;span style="color:#75715e">//将abc赋值到arr所指的地方,而arr是变量,可以更改
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>