linux进程通信-信号量使用.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux进程通信-信号量使用

一、相关知识 ?信号量:一个整数; ??大于或等于0时代表可供并发进程使用的资源实体数; ??小于0时代表正在等待使用临界区的进程数; ??用于互斥的信号量初始值应大于0; ??只能通过P、V原语操作而改变; ?信号量元素组成: ??1、表示信号量元素的值; ??2、最后操作信号量元素的进程ID ??3、等待信号量元素值+1的进程数; ??4、等待信号量元素值为0的进程数; ? 二、主要函数 ? ?1.1 创建信号量 ?int semget( ??key_t key,??//标识信号量的关键字,有三种方法:1、使用IPC——PRIVATE让系统产生, ?????//?2、挑选一个随机数,3、使用ftok从文件路径名中产生 ??int nSemes,??//信号量集中元素个数 ??int flag??//IPC_CREAT;IPC_EXCL 只有在信号量集不存在时创建 ?) ?成功:返回信号量句柄 ?失败:返回-1 ? ?1.2 使用ftok函数根据文件路径名产生一个关键字 ?key_t ftok(const char *pathname,int proj_id); ?路径名称必须有相应权限? ? ?1.3 控制信号量 ?int semctl( ??int semid,??//信号量集的句柄 ??int semnum,??//信号量集的元素数 ??int cmd,??//命令 ??/*union senum arg */...?//?? ?) ?成功:返回相应的值 ?失败:返回-1 ? ?命令详细说明: ?cmd:? ?IPC_RMID 删除一个信号量 ??IPC_EXCL 只有在信号量集不存在时创建 ??IPC_SET 设置信号量的许可权 ??SETVAL 设置指定信号量的元素的值为 agc.val ??GETVAL 获得一个指定信号量的值 ??GETPID 获得最后操纵此元素的最后进程ID ??GETNCNT 获得等待元素变为1的进程数 ??GETZCNT 获得等待元素变为0的进程数 ?? ?union senum 定义如下: ?union senum{ ??int val; ??struct semid_ds *buf; ??unsigned short * array; ?}agc; ?其中 semid_ds 定义如下: ?struct semid_ds{ ??struct ipc_pem sem_pem;??//operation pemission struct ??time_t sem_otime;??//last semop()time ??time_t sem_ctime;??//last time changed by semctl() ??struct sem *sembase;??//ptr to first semaphore in array ??struct sem_queue *sem_pending;?//pending operations ??struct sem_queue *sem_pending_last;?//last pending operations ??struct sem_undo *undo;??//undo requests on this arrary ??unsigned short int sem_nsems;?//number of semaphores in set ?}; ?? ?1.4 对信号量 +1 或 -1 或测试是否为0 ?int semop( ??int semid,? ??struct sembuf *sops,?//指向元素操作数组 ??unsigned short nsops?//数组中元素操作的个数 ?) ? ?结构 sembuf 定义 ?sembuf{ ??short int sem_num;?//semaphore number ??short int sem_op;?//semaphore operaion ??short int sem_flg?//operation flag ?}; ? 三、例子: ?2.1 服务器 #include sys/sem.h #include sys/ipc.h #define SEGSIZE 1024 #define READTIME 1 union semun { ?int val; ?struct semid_ds *buf; ?unsigned short *array; } arg; //生成信号量 int sem_creat(key_t key) { ?union semun sem; ?int semid; ?sem.val = 0; ?semid = semget(key,1,IPC_

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档