学习记录第二十七天

信号量

在Linux C语言中,信号量是一种用于实现进程或线程同步的机制。它可以帮助控制对共享资源的访问,防止数据竞争和不一致性。信号量通常具有两个基本操作:P(proberen,尝试)和V(verhogen,增加)。P操作会尝试减少信号量的值,如果信号量的值大于零,则操作成功,否则进程或线程会被阻塞。V操作则会增加信号量的值,并可能唤醒等待该信号量的进程或线程

POSIX信号量

POSIX信号量提供了一套标准的信号量操作接口,包括sem_init、sem_wait、sem_post和sem_destroy等函数。这些函数声明在<semaphore.h>头文件中。

1.sem_init函数用于初始化信号量,设置其值和共享属性。

2.sem_wait函数用于等待信号量,如果信号量的值大于0,则将其减1并返回,否则阻塞当前线程。

3.sem_post函数用于释放信号量,将信号量的值加1,可能唤醒等待的线程。

4.sem_destroy函数用于销毁信号量,释放与其关联的资源。
注意事项

1.在使用信号量时,应该确保正确初始化和销毁信号量,以避免资源泄露。

2.信号量的操作必须是原子的,以保证同步的正确性。

3.在多线程环境中,信号量通常用于保护共享资源,防止多个线程同时修改这些资源。

管道(Pipe)

管道是一种在Unix和类Unix操作系统中用于进程间通信(IPC)的机制,它允许数据从一个进程(或线程)流向另一个进程(或线程)。管道可以分为两种主要类型:无名管道和有名管道(FIFO)。

无名管道

无名管道是用于具有亲缘关系的进程(如父进程和子进程)之间的通信。当一个进程通过fork()函数创建一个子进程后,可以使用pipe()函数创建一个无名管道,然后通过读写端的文件描述符进行数据交换。无名管道在文件系统中没有对应的文件名,因此它们是匿名的,只在创建它们的进程之间可见。

有名管道(FIFO)

有名管道,或称为FIFO(First In First Out),是一种持久的管道,它们在文件系统中表现为特殊文件,因此可以被任何有权访问的进程使用,而不局限于具有亲缘关系的进程。有名管道可以跨越进程的创建和销毁,即使创建它们的进程终止后,这些管道仍然存在,直到被系统或管理员明确删除。

管道的工作原理

管道内部是一个先进先出的缓冲区,数据只能单向流动。通常一个进程负责写入数据(写端),另一个进程负责读取数据(读端)。数据的发送者通过向管道的写端写入数据,接收者通过从管道的读端读取数据。当数据写入管道的缓冲区满时,写端将被阻塞直到有空间可用;同样,当数据读取完毕,读端将阻塞直到有新的数据写入。

无名管道的概念和特点

无名管道是一种进程间通信机制,它允许有亲缘关系的进程之间通过一个共享的缓冲区进行数据交换。这种管道在创建时不在文件系统中显示,它的生命周期与创建它的进程相同。无名管道的特点包括:

1.亲缘关系:只有创建它的父进程及其子进程可以使用无名管道进行通信。

2.共享缓冲区:父子进程通过读写两端的文件描述符访问同一个缓冲区。

3.非持久化:一旦创建它的进程结束,无名管道就不再存在。

无名管道的创建和使用方法

无名管道的创建使用pipe()系统调用。这个调用创建一个管道,并返回两个文件描述符,一个用于读取(读端),另一个用于写入(写端)。创建后,父进程的标准输出文件描述符通常会被重定向到管道的写端,而子进程的标准输入文件描述符会被重定向到管道的读端。这样,父进程和子进程可以通过标准输入输出进行通信。

pipe()函数原型

pipe()函数用于创建一个无名管道,该函数的原型定义在unistd.h头文件中,如下所示:

cs 复制代码
#include <unistd.h>
int pipe(int pipefd[2]);

这里的pipefd是一个整数数组,用来存放由pipe()函数返回的两个文件描述符。pipefd[0]表示管道的读端,而pipefd[1]表示管道的写端。

pipe()函数使用方法

使用pipe()函数创建管道的一般步骤如下:

1.包含必要的头文件<unistd.h>。

2.声明一个整数数组来存放文件描述符。

3.调用pipe()函数,并检查返回值以确认管道是否成功创建。

4.使用返回的文件描述符进行读写操作。

注意事项

1.在使用无名管道时,需要确保正确管理文件描述符,避免资源泄漏。

2.由于管道的容量有限,需要处理可能出现的溢出情况。

3.在多进程环境中,应考虑同步机制以避免数据竞争。

相关推荐
Johny_Zhao1 小时前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
RuoZoe7 小时前
重塑WPF辉煌?基于DirectX 12的现代.NET UI框架Jalium
c语言
chlk1232 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑2 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件2 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI3 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing4 天前
WSL+Cpp开发环境配置
linux