Linux信号量

sem_init的应用

(1)信号量用sem_init函数创建的,下面是它的说明:

#include<semaphore.h>

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

这个函数的作用是对由sem指定的信号量进行初始化,设置好它的共享选项,并指定一个整数类型的初始值。pshared参数控制着信号量的类型。如果 pshared的值是0,就表示它是当前进程的局部信号量或者说为线程的共享信号量;否则,其它进程就能够共享这个信号量。value的值为信号量的初始值

(2)这两个函数控制着信号量的值,它们的定义如下所示:

#include <semaphore.h>

int sem_wait(sem_t * sem);

int sem_post(sem_t * sem);

这两个函数都要用一个由sem_init调用初始化的信号量对象的指针做参数。

sem_post函数的作用是给信号量的值加上一个“1”,它是一个“原子操作"即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;

而同时对同一个文件进行读、追加和写操作的两个程序就有可能会引起冲突。(如何处理?)信号量的值永远会正确地加一个“2”--因为有两个线程试图改变它。

sem_wait函数也是一个原子操作,它的作用是从信号量的值减去一个“1”,但它永远会先等待该信号量为一个非零值才开始做减法。也就是说,如果你对一个值为2的信号量调用sem_wait(),线程将会继续执行,信号量的值将减到1。如果对一个值为0的信号量调用sem_wait(),这个函数就会地等待直到有其它线程增加了这个值使它不再是0为止(阻塞)。如果有两个线程都在sem_wait()中等待同一个信号量变成非零值,那么当它被第三个线程增加一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另一个还将处于等待状态。

信号量这种“只用一个函数就能原子化地测试和设置”的能力下正是它的价值所在。还有另外一个信号量函数sem_trywait,它是sem_wait的非阻塞搭档。sem_trywait是一个立即返回函数,不会因为任何事情阻塞。根据其返回值得到不同的信息。如果返回值为0,说明信号量在该函数调用之前大于0,但是调用之后会被该函数自动减1,至于调用之后是否为零则不得而知了。如果返回值为EAGAIN说明信号量计数为0。

(3) 获得信号量sem的值,并保存到valp中。下面的定义:

#include<semaphore.h>

int sem_getvalue(sem_t *sem, int *valp);

(4) 最后一个信号量函数是sem_destroy。这个函数的作用是在我们用完信号量对它进行清理。下面的定义:

#include<semaphore.h>

int sem_destroy (sem_t *sem);

这个函数也使用一个信号量指针做参数,归还自己占据的一切资源。在清理信号量的时候如果还有线程在等待它,用户就会收到一个错误。

然而在linux的线程中,其实是没有任何资源关联到信号量对象需要释放的,因此在linux中,销毁信号量对象的作用仅仅是测试是否有线程因为该信号量在等待。如果函数返回0说明没有,正常注销信号量,如果返回EBUSY,说明还有线程正在等待该信号量的信号。

与其它的函数一样,这些函数在成功时都返回“0”。

时间: 2024-10-25 22:01:42

Linux信号量的相关文章

linux信号量之进程间同步

概念 linux信号量:允许多个线程同时进入临界区,可以用于进程间的同步. 和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区. 所在头文件:semaphore.h 主要函数 初始化函数 int sem_init(sem_t *sem, int pshared, unsigned int value) sem:要初始化的信号量 pshared:此信号量是在进程间共享还是线程间共享 value:信号量的初始值 删除函数 int sem_destroy(sem_t *sem) sem:要销

Linux信号量详解

1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. 我们使用信号量,来解决进程或线程间共享资源引发的同步问题. 2.Linux中信号量的使用Linux提供了一组信号量API,声明在头文件sys/sem.h中.1)semget函数:新建信号量 int semget(key_t key,int num_sems,int sem_flags); key:信

Linux 信号量 生产者消费者小例题 (嘘,我是菜鸟~)

菜鸟偶遇信号量,擦出火花(只有不熟才会有火花).于是上网搜资料和看<Unix环境高级编程>实现了几个小例题,高手请勿喷!这几位写得非常好啊: 题目来源: http://www.it165.net/os/html/201312/7039.html 信号量及其用法:http://www.cnblogs.com/hjslovewcl/archive/2011/03/03/2314341.html Mutex与Semaphore区别著名的厕所理论:http://koti.mbnet.fi/niclas

Linux 信号量互斥编程

所谓信号量,其实就是一个数字.内核给这个数字赋予一定的含义,让它等于不同的值时所表示的意义不同.这样就可以用它来标示某种资源是否正被使用.信号的分类其实挺多的,主要还是二值和计数器.这里讨论二值 现在有个文件,有两个进程要同时访问它.进程A 要往里面写入 "Math class is cancel",进程B 要往里面写入“English test”.正常情况下这两个信息会被完整的写入文件中.但是如果进程A写到"Math class" 就暂停,接着B进程就开始写“En

linux 信号量之SIGNAL 0&lt;转&gt;

我们可以使用kill -l查看所有的信号量解释,但是没有看到SIGNAL 0的解释. [[email protected]~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18

[转] linux 信号量之SIGNAL

我们可以使用kill -l查看所有的信号量解释,但是没有看到SIGNAL 0的解释. [[email protected]~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18

Linux 信号量同步编程

前一篇文章概述了Linux 系统中信号量互斥编程,这篇文章正好是前一篇的姊妹篇----信号量同步.说它们是姊妹篇是因为它们都是利用了内核的信号量机制实现了进程间的通信.因为两者所解决的问题不同,因此它们使用的场景就会有所区别. 信号量互斥主要解决的问题是:进程间需要同时访问某种资源,但是它们对资源的操作会互相影响对方的操作结果,因此需要一种机制实现让进程在访问资源时能禁止其他进程访问相同的资源.而信号量同步则解决了另一个经典问题:生产者和消费者之间的协同工作问题. 首先描述一下生产者和消费者问题

Linux信号量实践(1)

进程的同步与互斥 顺序程序与并发程序特征 顺序程序 并发程序 顺序性 共享性 封闭性:(运行环境的封闭性) 并发性 确定性 随机性 可再现性 进程互斥 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥. 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源. 在进程中涉及到互斥资源的程序段叫临界区. 互斥示例 说明:如果此时票数X=1,A进程与B进程同时抢到临界资源X,都执行X--,则会出现X<0的情况,这种情况肯定是不

linux信号量的SEM_UNDO参数

信号量是不同进程间或一个给定进程内部不同线程间同步的机制.System V信号量是一个或多个信号量的集合,其中的每一个都是氮素的计数信号量.System V信号量由内核维护,主要函数有:semget,semop,semctl. 我们重点来讨论semop函数,该函数的主要功能是对信号进行PV操作. P操作负责把当前进程由运行状态转换为阻塞状态,知道另外一个进程唤醒它.操作为:申请一个空闲资源(把信号量减1),若成功,则退出,若失败,则该进程被阻塞. V操作负责把被阻塞的进程唤醒,它有一个参数表,存