学习记录第二十七天

信号量

在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.在多进程环境中,应考虑同步机制以避免数据竞争。

相关推荐
凌肖战6 分钟前
力扣上刷题之C语言实现(数组)
c语言·算法·leetcode
李小星同志35 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c1 小时前
MFC 使用细节
笔记·学习·mfc
王哲晓1 小时前
Linux通过yum安装Docker
java·linux·docker
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
小江湖19941 小时前
元数据保护者,Caesium压缩不丢重要信息
运维·学习·软件需求·改行学it
代码雕刻家1 小时前
数据结构-3.1.栈的基本概念
c语言·开发语言·数据结构
gopher95111 小时前
linux驱动开发-中断子系统
linux·运维·驱动开发
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
dot.Net安全矩阵1 小时前
.NET内网实战:通过命令行解密Web.config
前端·学习·安全·web安全·矩阵·.net