本文主要是介绍进程间通信——互斥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1. sem_open和sem_init的区别
- 2.使用方法
多个进程同步访问同一个资源和多个线程同步访问同一个资源相同,也会存在资源抢占的情况。所以需要进行资源加锁。
1. sem_open和sem_init的区别
适用范围:sem_open
用于获取一个命名信号量,而sem_init
用于获取一个未命名的信号量
使用场景:sem_open
用于跨进程共享信号量的场景,sem_init
用于在一个进程中初始化信号量,例如在一个线程中同步访问共享资源
参数:sem_open
需要执行信号量的名称和权限,而sem_init
只需要指定信号量的地址初始参数
返回值:sem_open
返回指向信号量的指针,sem_init
没有返回值
总结下来主要是在多个进程中要使用sem_open
来创建信号量
2.使用方法
使用起,从创建到销毁来大概分为四步
- 创建命名信号量
sem_open
sem_t *sem_open(const char *name, int oflag, ...);
参数:
name:信号量的名字;
oflag:打开标志,常用的有 O_CREAT 和 O_EXCL。O_CREAT 表示如果名字的信号量不存在则创建它,而 O_EXCL 则在创建新信号量时使用,如果名字的信号量已经存在则返回错误
...:代表当使用 O_CREAT 标志时,用于指定信号量初始值的参数。如果没有使用 O_CREAT,则此参数被忽略。
- 等待信号量
sem_wait
sem_wait() 用于等待信号量,它会使调用进程等待,直到信号量的值大于零,其定义如下:
int sem_wait(sem_t *sem);@参数
sem;指向信号量的指针@返回值
若函数执行成功,返回 0,失败返回-1。
- 释放信号量
sem_post
sem_post()用于当一个进程完成对共享资源的访问后释放信号量,这样其他等待该信号量的进程就可以继续执行。其定义如下:
int sem_post(sem_t *sem);
@参数
sem;指向信号量的指针@返回值
若函数执行成功,返回 0,失败返回-1。
- 关闭信号量sem_close
5.删除命名信号量sem_unlink
这篇关于进程间通信——互斥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!