<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[only_tian的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/only_tian</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; only_tian]]></copyright><item><title><![CDATA[linux进程间通信---内存映射]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/148617036</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/148617036</guid><author>only_tian</author><pubDate>Thu, 12 Jun 2025 19:54:07 +0800</pubDate><description><![CDATA[内存映射区是将文件或设备的内容映射到进程的虚拟内存地址空间中。进程可以像操作普通内存一样读写这些映射的区域，而这些操作会直接反映到文件或设备上。对于进程间通信，可以使用匿名内存映射区（不对应具体的文件），进程通过共享这个匿名内存区域来进行数据交换。]]></description><category></category></item><item><title><![CDATA[linux进程通信--无名管道(PIPE)和有名管道(FIFO)]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/148593116</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/148593116</guid><author>only_tian</author><pubDate>Wed, 11 Jun 2025 20:54:46 +0800</pubDate><description><![CDATA[本文介绍了Linux进程通信中的管道机制。进程是Linux中独立分配资源的最小单位，具有独立内存空间。无名管道(PIPE)是半双工通信方式，仅限父子进程间使用，通过pipe()函数创建，使用read/write操作。有名管道(FIFO)允许任意进程通信，在文件系统中创建管道文件，通过mkfifo命令或函数创建，同样使用文件I/O操作。两者都是半双工，数据先进先出，区别在于无名管道限于父子进程，有名管道可用于任意进程间通信。文章还提供了代码示例说明管道创建和使用方法。
]]></description><category></category></item><item><title><![CDATA[Linux用户空间和内核空间]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/147618265</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/147618265</guid><author>only_tian</author><pubDate>Tue, 29 Apr 2025 20:06:30 +0800</pubDate><description><![CDATA[在用户态下，进程运行在用户地址空间中，被执行的代码要受到 CPU 的诸多检查，它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址，且只能对任务状态段(TSS)中 I/O 许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。运行的代码也不受任何的限制，可以自由地访问任何有效地址，也可以直接进行端口的访问。上图展示了整个进程地址空间的分布，其中4G的地址空间分为两部分，在用户空间内，对应了内存分布的五个段：数据段、代码段、BSS段、堆、栈。]]></description><category></category></item><item><title><![CDATA[typedef 和 #define]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/147365962</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/147365962</guid><author>only_tian</author><pubDate>Sun, 20 Apr 2025 15:23:53 +0800</pubDate><description><![CDATA[c 语言支持一种typedef的机制，它允许你为各种数据制定新的名字。例如 把ptr_to_char声明为一个指向字符的指针。typedef是在编译阶段处理，并且具有类型检查功能。typdef 是关键字， define是预处理指令。define 是在预处理阶段进行简单替换。define 用于变量定义 宏开关 常量。typedef 通常用于类型定义。]]></description><category></category></item><item><title><![CDATA[注释和预处理]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/147364234</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/147364234</guid><author>only_tian</author><pubDate>Sun, 20 Apr 2025 14:23:48 +0800</pubDate><description><![CDATA[预处理阶段，预处理器会根据预处理指令将 头文件添加到源文件中去，将宏定义进行替换后递给编译器进行编译。在#if 和 #endif 之间的程序段可以有效的从程序中删除；即使这段代码中之间原先存在注释也无妨。/* 和 */多行注释。这些注释只能将注释的内容不生效。不能从源文件中真正的删除。调用函数中 被调用函数可以修改传值调用参数的值， 而按值传递在被调用函数返回时都会丢失(函数执行完毕栈回收)。如果需要将代码从程序中有效的删除(实际运行的程序中并没有这块代码)。最好的办法是使用 #if 指令。]]></description><category></category></item><item><title><![CDATA[Linux下 线程优先级 和 线程调度策略 设置]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/136719619</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/136719619</guid><author>only_tian</author><pubDate>Thu, 14 Mar 2024 20:19:47 +0800</pubDate><description><![CDATA[参考连接：https://blog.youkuaiyun.com/weixin_44845857/article/details/118409858。]]></description><category></category></item><item><title><![CDATA[Linux进程间通信]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/135755828</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/135755828</guid><author>only_tian</author><pubDate>Mon, 22 Jan 2024 20:04:01 +0800</pubDate><description><![CDATA[一个大型的应用系统，往往需要众多进程协作，进程（Linux进程概念见附1）间通信的重要性显而易见。本系列文章阐述了 Linux 环境下的几种主要进程间通信手段。]]></description><category></category></item><item><title><![CDATA[【嵌入式开发-多线程同步】]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/132590771</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/132590771</guid><author>only_tian</author><pubDate>Sun, 03 Sep 2023 20:55:34 +0800</pubDate><description><![CDATA[条件变量是利用线程间共享的全局 变量进行同步的一种机制，主要包括两个动作：一个线程等待"条件变量的条件成立"而挂起；条件的检测是在 互斥锁的保护下进行的。如果另一个线程改变了条件，它发信号给关联的条件变量，唤醒一个或多个等待它的线程，重新获得互斥锁，重新评价条件。使用时，条件变量被用来阻塞一个线程，当条件不满足时，线程往往解开相应的互斥锁并等待条件发生变化。为了协调线程之间的制约关系引入了线程同步的概念(线程间的通信主要是用于线程同步，所以线程没有进程通信中用于数据交换的通信机制)。]]></description><category></category></item><item><title><![CDATA[线程锁和读写锁]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/132641187</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/132641187</guid><author>only_tian</author><pubDate>Sat, 02 Sep 2023 18:31:11 +0800</pubDate><description><![CDATA[当一个线程要访问临界区时，会对该临界区进行加锁。在没有解锁之前其他线程要对临界资源访问，则这些线程会被阻塞睡眠，直到解锁。如果解锁时有一个或多个线程阻塞，那么这些睡眠的线程会变成就绪状态，然后第一个变为就绪状态的线程就会获取临界区的使用权，并且再次加锁，其他线程继续阻塞等待。]]></description><category></category></item><item><title><![CDATA[细谈野指针]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/131147636</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/131147636</guid><author>only_tian</author><pubDate>Sat, 10 Jun 2023 22:44:14 +0800</pubDate><description><![CDATA[野指针就是指针指向的位置是不可知的(随机的，不正确的，没有明确限制的)]]></description><category></category></item><item><title><![CDATA[TCP的可靠性]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/131037080</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/131037080</guid><author>only_tian</author><pubDate>Sun, 04 Jun 2023 22:07:02 +0800</pubDate><description><![CDATA[应用数据被分割成TCP认为最适合发送的数据块。(这和UDP完全不同，应用程序产生的数据报长度将保持不变)。确认响应：对于一个收到的请求，将发送一个确认。这个确认通常要延迟几分之一秒。超时重传: 当TCP发出一个段后，它启动一个定时器，等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。TCP给发送的每一一个包进行编号 ,接收方对数据包进行排序,把有序数据传送给应用层。]]></description><category></category></item><item><title><![CDATA[UDP编程模型]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130914077</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130914077</guid><author>only_tian</author><pubDate>Sun, 28 May 2023 16:27:16 +0800</pubDate><description><![CDATA[UDP 循环服务器模型。server.c 代码。]]></description><category></category></item><item><title><![CDATA[TCP编程模型]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130900484</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130900484</guid><author>only_tian</author><pubDate>Sat, 27 May 2023 14:50:48 +0800</pubDate><description><![CDATA[TCP编程模型一般如下TC编程模型分为客户端和服务端，两者编程流程如下：TCP服务端流程TCP客户端流程。]]></description><category></category></item><item><title><![CDATA[static关键字]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130797580</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130797580</guid><author>only_tian</author><pubDate>Sun, 21 May 2023 22:03:40 +0800</pubDate><description><![CDATA[c.静态成员变量的访问：类名::静态成员变量名  或  对象.静态成员变量名。b.静态成员函数不能调用非静态成员函数。而非静态成员函数可以调用静态成员函数。a.静态成员函数没有this指针，不能访问非静态成员（变量、函数）。a.静态成员变量需在类中声明，在类外定义（const修饰除外）。b.静态成员变量为所有类对象共享，并没有包含在具体的对象中。a.变量的储存区域在全局数据区的静态常量区。b.变量的作用域由当前程序变为整个文件。a.函数的作用域由当前程序变为整个文件。a.储存区由栈变为静态变量区。]]></description><category></category></item><item><title><![CDATA[Socket网络编程基础]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130794185</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130794185</guid><author>only_tian</author><pubDate>Sun, 21 May 2023 21:27:42 +0800</pubDate><description><![CDATA[本机进程所使用进程号来区分不同的进程。进程间的通信方式有管道、信号、消息队列、共享内存、信号量等。而网络中进程间通信，首先需要知道进程所在的主机，即网络中唯一的标识即网络层的IP地址，主机上的进程可以通过传输层的协议和端口号识别。]]></description><category></category></item><item><title><![CDATA[结构体和共用体的区别]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130668435</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130668435</guid><author>only_tian</author><pubDate>Sun, 14 May 2023 14:26:14 +0800</pubDate><description><![CDATA[结构体和共用体的主要区别在于存储方式的不同。]]></description><category></category></item><item><title><![CDATA[回调函数中同步回调和异步回调的区别]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130665972</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130665972</guid><author>only_tian</author><pubDate>Sun, 14 May 2023 10:38:36 +0800</pubDate><description><![CDATA[如果用户层B把函数的指针（地址）作为参数传递给底层驱动A，当这个指针在A中被用为调用它所指向的函数时，我们就说这是回调函数。第一种方法B是无法知道数据d何时会发生变化，只有B自己定时去读取或者在需要的时候去取数据。第二种方法是A在数据发生变化后主动将数据告诉B，效率比第一种高。其实回调函数就是一个通过。]]></description><category></category></item><item><title><![CDATA[C语言中字节对齐]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130473962</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130473962</guid><author>only_tian</author><pubDate>Wed, 03 May 2023 19:04:29 +0800</pubDate><description><![CDATA[在现代计算机中，内存空间都是按照字节划分，理论上可以从任何起始地址访问任何变量，但是在实际中访问特定变量时经常在特定的内存地址中的访问(例如访问结构体中的指定变量)，这时就需要各种数据类型按照一定的规则在内存中存放,而不是一个一个顺序的存放，这就是对齐。]]></description><category></category></item><item><title><![CDATA[内联函数 —— C 中关键字 inline 用法解析]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130331092</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130331092</guid><author>only_tian</author><pubDate>Sun, 23 Apr 2023 22:03:47 +0800</pubDate><description><![CDATA[在C语言中，调用函数时，会进行函数入栈 ，执行，函数出栈的操作。这些操作执行都需要时间，并且函数入栈出栈 ，会消耗栈内存或栈空间。对于一些频繁调用且代码段不多的函数来说，在入栈出栈时占用很多时间和栈内存。为了解决这个问题，C语言引入了inline修饰符，表示为内联函数。看下面的例子这个就是内联函数的用法；在程序编译时，编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。这样做会增加目标程序的代码量，但是在执行过程中就没有函数入栈出栈的操作，减少了程序的执行时间。]]></description><category></category></item><item><title><![CDATA[static关键字]]></title><link>https://blog.youkuaiyun.com/only_tian/article/details/130311360</link><guid>https://blog.youkuaiyun.com/only_tian/article/details/130311360</guid><author>only_tian</author><pubDate>Sat, 22 Apr 2023 22:02:17 +0800</pubDate><description><![CDATA[链接属性external的变量，所有源文件中的所有函数都可以访问他。只要变量并非声明于代码块内部或者函数定义内部，他在缺省情况下的链接属性即为external。如果一个变量声明于代码块内部，在他前面添加extern关键字将使它所引用的是全局变量而非局部变量。]]></description><category></category></item></channel></rss>