学习记录第二十七天

信号量

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

相关推荐
BullSmall21 分钟前
linux 根据端口查看进程
linux·运维·服务器
_F_y31 分钟前
Linux:进程间通信
linux
●VON34 分钟前
小V健身助手开发手记(四):打造专属健康空间——以 PersonContent构建统一风格的个人中心
人工智能·学习·openharmony·开源鸿蒙·von
●VON36 分钟前
小V健身助手开发手记(三):用成就点燃坚持——构建可视化激励系统
学习·openharmony·总结·开源鸿蒙·von
weixin_4624462340 分钟前
Kali/ubuntu Linux 中彻底删除 Cursor 编辑器(含 dpkg 非空目录警告解决)
linux·ubuntu·cursor
Nan_Shu_61440 分钟前
学习:Vue (2)
javascript·vue.js·学习
Hard but lovely1 小时前
linux:----进程守护化(Daemon)&&会话的原理
linux·运维·服务器
R-G-B1 小时前
哈希表(hashtable),哈希理论,数组实现哈希结构 (C语言),散列理论 (拉链发、链接发),散列实现哈希结构,c++ 实现哈希
c语言·哈希算法·散列表·哈希表·数组实现哈希结构·散列实现哈希结构·c++ 实现哈希
历程里程碑1 小时前
C++ 6 :string类:高效处理字符串的秘密
c语言·开发语言·数据结构·c++·笔记·算法·排序算法
未来之窗软件服务1 小时前
幽冥大陆(四十八)P50酒店门锁SDK 苹果object c语言仙盟插件——东方仙盟筑基期
c语言·开发语言·酒店门锁·仙盟创梦ide·东方仙盟·东方仙盟sdk