学习记录第二十七天

信号量

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

相关推荐
diablobaal3 分钟前
云计算学习100天-第21天
学习
MrZhangBaby4 分钟前
SQL-leetcode—3374. 首字母大写 II
linux·sql·leetcode
czhc114007566330 分钟前
LINUX 820 shell:shift,expect
linux·运维·excel
望获linux1 小时前
【实时Linux实战系列】基于实时Linux的物联网系统设计
linux·运维·服务器·chrome·php
草莓熊Lotso1 小时前
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day8
c语言·开发语言·c++·刷题·强化训练
yuxb732 小时前
Linux 文本处理与 Shell 编程笔记:正则表达式、sed、awk 与变量脚本
linux·笔记·正则表达式
刘一说2 小时前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
wdxylb7 小时前
云原生俱乐部-shell知识点归纳(1)
linux·云原生
飞雪20079 小时前
Alibaba Cloud Linux 3 在 Apple M 芯片 Mac 的 VMware Fusion 上部署的完整密码重置教程(二)
linux·macos·阿里云·vmware·虚拟机·aliyun·alibaba cloud
路溪非溪9 小时前
关于Linux内核中头文件问题相关总结
linux