- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 1union 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)