进程间通信:管道【Unix编程】
2025-08-20
管道是Unix/Linux系统中最基础的进程间通信机制,分为匿名管道和命名管道两种类型,都具有自同步和单工的特点。匿名管道通过pipe()系统调用创建,只能用于有血缘关系的进程间通信,如父子进程或兄弟进程,它创建一个单向的单工数据传输通道;命名管道(FIFO)通过mkfifo()创建,以特殊文件形式存在于文件系统中,可以用于任意进程间的通信。两种管道都具有天然的自同步特性:当管道缓冲区满时,写操作会自动阻塞直到有空间可用;当管道为空时,读操作会自动阻塞直到有数据可读,这种阻塞机制无需额外的同步代码即可实现发送方和接收方进程的自动协调。管道的数据流动是单向的,发送方只能写入数据,接收方只能读取数据,体现了典型的单工通信特点,但管道容量有限且不支持随机访问。
1432 字
|
7 分钟
高级IO:存储映射IO【Unix编程】
2025-08-18
作用mmap用于在调用进程的虚拟地址空间中创建一个新的映射。这个映射可以是文件或设备的映射,也可以是匿名映射。通过mmap,可以将文件或设备的内容映射到内存中,从而可以通过直接访问内存来读取或写入文件内容。
1071 字
|
5 分钟
高级IO:IO多路转接【Unix编程】
2025-08-16
IO多路转接(I/O Multiplexing),用于同时监控多个文件描述符的行为,当其中任何一个文件描述符就绪时进行处理。
在传统的阻塞I/O模型中,一个I/O操作(如读取数据)会导致程序阻塞,直到操作完成。这种方式在处理多个连接时效率较低,因为程序需要为每个连接单独分配一个线程或进程。
IO多路转接通可以同时监控多个文件描述符。当其中的任何一个文件描述符变为“就绪”状态,相应的I/O操作就会被触发,这样程序就可以在一个或少量的线程中处理大量的并发任务。
2757 字
|
14 分钟
高级IO:非阻塞IO【Unix编程】
2025-08-15
阻塞IO: 阻塞IO是指在进行IO操作(如读写文件、网络通信等)时,如果数据不可用或者操作未完成,程序会暂停执行,等待IO操作完成后才继续。这意味着程序在等待期间无法执行其他任务。
2528 字
|
13 分钟
线程同步:条件变量【Unix编程】
2025-08-12
条件变量(Condition Variable)是多线程编程中常用的一种同步机制,它主要用于线程之间的协调和通信,使线程能够在某些条件满足时被唤醒,或者等待某些条件发生。条件变量通常和互斥锁(Mutex)一起使用。
工作过程:
2051 字
|
10 分钟
线程同步:互斥锁【Unix编程】
2025-08-12
在变量修改时间多于一个存储器访问周期的处理器结构中,当存储器读与存储器写这两个周期交叉时,这种不一致就会出现。线程 A读取变量然后给这个变量赋予一个新的数值,但写操作需要两个存储器周期。当线程B在这两个存储器写周期中间读取这个变量时,它就会得到不一致的值。
为了解决这个问题,线程不得不使用锁,同一时间只允许一个线程访问该变量。图11-8描述了这种同步。如果线程B希望读取变量,它首先要获取锁。同样,当线程A更新变量时,也需要获取同样的这把锁。这样,线程B在线程A释放锁以前就不能读取变量。
多个线程同时读取同一个文件内容,加1,然后把结果各自写回。由于读取和写入不是原子的,可能出现比如三个线程都读到0,各自加1,然后都写回1,最终文件里只加了一次,而不是三次。
3644 字
|
18 分钟
进程环境【Unix编程】
2025-08-05
C程序总是从main函数开始执行,从main函数结束执行。即main是程序的入口和出口。
当内核执行C程序时(使用一个exec函数),在调用main前先调用一个特殊的启动例程。可执行程序文件将此启动例程指定为程序的起始地址——这是由连接编辑器设置的,而连接编辑器则由C编译器调用。启动例程从内核取得命令行参数和环境变量值,然后为按上述方式调用main函数做好安排。
3817 字
|
19 分钟