linux sem 多进程sem_open sem_init,linux中的信号量[2]

本文详细介绍了Linux中的POSIX信号量,包括有名信号量和无名信号量的创建、初始化、操作及销毁。通过示例展示了信号量在多进程和多线程同步中的应用,对比了POSIX信号量与System V信号量的差异,并提供了简单的生产者-消费者问题的解决方案。了解这些内容有助于开发者在System V和Posix信号量之间做出选择。
摘要由CSDN通过智能技术生成

POSIX信号量

与POSIX信号量比较System V信号量潜在的学习曲线要高得多,当阅读完这个部分并和上面System V的部分对比,你就会更加的这么认为。

首先,POSIX使用简单的语义去创建、初始化和对信号量进行操作。它们提供了一个有效的方式来处理进程间通讯。POSIX有两种类型的信号量,有名信号量和无名信号量。

有名信号量

如果你看man手册,你将会看到一个有名信号量像system v信号量一样由一个名字标识,并且类似的这个信号量也有内核存留。这就意味着这些信号量像system V一样是系统范围值并且在任何时候可存活并被限制一定的值之内。有名信号的优点是它们提供了一种在不相关进程和相关进程(如线程)间的同步机制。

一个有名信号可以通过调用下面的函数创建:

sem_t *sem_open(const char *name,  int oflag, mode_t mode , int value);

Name

用于标识信号量的名字

Oflag

被设置为O_CREAT用来创建一个信号量(如果和0_EXCL一起,当这个信号量已经存在时候这个调用将会失败)

mode_t

控制新的信号量的访问权限

Value

指定信号量的初始化值

与svstem V的方式截然不同的是它使用一个单一的调用就完成了信号量的创建、初始化和权限的设置。自然它也是更清楚和具有原子性的。另外一个不同是system V信号量通过一个int类型的值来标识自己(类似于调用open()返回的fd),而sem_open函数返回sem_t类型作为posix信号量的标识值。

从现在起,都是对信号量所要进行的操作,锁住一个信号量的语义是:

int  sem_wait(sem_t *sem);

这个调用将锁住信号量,如果这个信号量的计数是大于0,锁住这个信号量之后,信号量计数减一。如果这个信号量的计数是0,这个调用被阻塞。

解锁一个信号量的语义是:

int  sem_post(sem_t *sem);

这个调用对信号量增1然后返回。

一旦你使用了一信号量,销毁它们就变得很重要。在做这个之前,要确定所有对这个有名信号量的引用都已经通过sem_close()函数关闭了,然后只需在退出或是退出处理函数中调用sem_unlink()去删除系统中的信号量,注意如果有任何的处理器或是线程引用这个信号量,sem_unlink()函数不会起到任何的作用。无名信号量

根据man手册,一个无名信号量被放置在一个被多个线程(多线程共享信号量)或是进程(多进程共享信号量)共享的内存区域。一个线程共享信号量被放置在一个只有同一个进程的线程共享它们的区域,例如一个全局的变量。一个进程共享的信号量被放置在一个不同进程可以共享它们的区域,例如一个共享内存区。一个无名信号量为线程间和相关的进程间提供同步机制。无名信号量不需要使用sem_open调用,下面的两行代码替换了它的行为:

{

sem_t semid;

int sem_init(sem_t *sem, int pshared, unsigned  value);

}

Pshared:这个参数用来标识这个信号量是在一个进程的线程间共享还是在进程之间共享,如果pshared这个标识是0,表示这个信号在一个进程的线程内部共享,如果它是一个非零的值,那么它在不同进程之间共享。

Value:表示这个信号量被初始化的值。

一旦这个信号被初始化,程序员就可以去操作这个sem_t类型的信号量。信号量的锁操作和解锁操作如下面所展示的:sem_wait(sem_t *sem)和sem_post(sem_t *sem)。删除一个无名信号量之需要调用sem_destroy函数。

这个文章的最后的部分有个使用POSIX信号量开发的简单的生产者和消费者的例子。

System V信号量和Posix信号量的比较:

1 System V信号量和Posix信号量实现的一个显著的不同是:对于System V信号量你可以控制每次自增或是自减的信号量计数,而在Posix里面,信号量计数每次只能自增或是自减

Posix信号不允许操作信号量的权限,而对于System V信号允许你将信号量权限改为以前信号量的一个子集。

2. 在POSIX信号量里面创建和初始化是原子的(从使用者的角度)。

3. 从使用的角度,System V信号量是复杂的,而Posix信号量是简单。

4. 和System V信号量相比Posix信号量的可扩展性(使用无名信号量)是更好的,在一个用户/客户情景中,需要每个用户创建它自己的服务器示例,使用Posix模型讲更好。

5. 对于System V信号量当它创建一个信号量对象时,要创建一个信号量数组;而Posix信号量只是创建一个,鉴于这个特性,在System V里面信号量(内存占有量)与Posix相比是代价更高的。

6. 据说Posix信号量的性能比System V信号量更

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值