Linux下信号量的使用概要1.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux下信号量的使用概要1

LINUX下进程间信号量的使用SUNNY.MAN1.使用信号量的目的打个比方,如果两个进程同时操作一块共享内存。其中一个进行写数据操作,另一个读数据操作。如果没有使用同步信号,将会产生资源冲突。举个例子解释:当一个进程在0x0000这个地址写入“this is a test!!!!”,因为这不是一个原子操作,那么可能刚好写完”this is a”时,读的进程便开始读数据,那么它读到的数据就会是 this is a 而不是this is a test!!!!。这就是资源没有同步而引起的。为了数据的完整性和资源的同步性,我们使用信号量。一句话来说,为了让N个进程对一个共同操作的动作顺序化,我们必须使用同步机制。2.信号量相关函数介绍System V 信号量的创建和打开 #include sys/sem.hintsemget(key_t key, intnsems, intsemflg);semget 用于创建或打开一个已存在的信号量。 若成功就返回非负的标识符,否则返回-1。key : 用于生成唯一信号量的 key ,主要的目的是使不同进程在同一该 IPC 汇合。 key 可以是事先不同的进程约定好的一个值,也可以不同进程通过相同的路径名和项目 ID,调用 ftok() 函数,生成一个键。 nsems :表示信号量集中信号量的个数,如果创建一个信号量集, nsems 必须是一个非 0 正整数,如果打开一个指定的信号量集, nsems 可以指定为 0 。 semflag : IPC_CREAT, IPC_EXCL, 以及 IPC 的指定权限位。如果为 IPC_CREAT | IPC_EXCL ,当该信号量集以及存在会返回错误。 errno 为 EEXIST 。 semget 的返回值是被称为信号量标识符的整数, semop 和 semctl 函数将通过该标识符对信号量集进行操作。 注:这里需要知道是调 semget() 创建一个新的信号量集并没有对之初始化,需要调用后面要讲的 semctl() 函数进行初始化。这样 System V 信号量的创建和初始化就不是一个原子操作,这是一个很大的缺陷。会出现使用未初始化信号量集的问题,我将在下面的段落讲解如何避免这种情况。3.System V 信号量的控制操作#include sys/sem.hintsemctl(intsemid, intsemnum, intcmd, .../* union semunarg*/);//若失败返回-1,并设置errno。semctl 函数主要是对信号量集的一系列控制操作,根据操作命令 cmd 的不同,执行不同的操作,依赖于所请求的命令,第四个参数是可选的, semid : System V 信号量的标识符; semnum :表示信号量集中的第 semnum个信号量。它的取值范围: 0~nsems-1 。 cmd :操作命令; arg :如果使用该参数,该参数的类型为 union semun,它是多个特定命令的联合。 按照SUS 明确规定, 这个结构必须有用户自己定义,在Linux 2.6.18的系统头文件中也没有该结构的定义,但在bits/sem.h 中有一段对该结构的定义的建议,不过是注释掉的。 include bits/sem.hunionsemun {intval; // Value for SETVALstructsemid_ds *buf; // Buffer for IPC_STAT, IPC_SETunsigned short *array; // Array for GETALL, SETALLstructseminfo *__buf; // Buffer for IPC_INFO(Linux-specific)};semctl 中 cmd 命令有 10 种,如下: ?IPC_STAT :获取此信号量集合的 semid_ds 结构,存放在第四个参数 arg 的 buf 中; ?IPC_SET :通过 arg.buf 来设定信号量集相关联的 semid_ds 中信号量集合权限为 sem_perm 中的 uid , gid , mode 。 ?IPC_RMID :从系统中删除该信号量集合。这种删除立即发生,仍在使用该信号量集的其他进程,在下次对该信号量集进行操作的时候,会发生错误并返回 EIDRM 。这和 POSIX 信号量是不一样的。 POSIX 信号量 sem_unlink 只是会立即删除信号量的在文件系统中的文件,而信号量的析构是在最后一个 sem_close 发生是进行的。 ?GETVAL :返回第semnum个信号量的值; ?SETVAL :设置第semnum个信号量的值,该值由第四个参数

文档评论(0)

676200 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档