- 1、本文档共58页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章 System V进程间通信
第5章 System V进程间通信 1 2 System V IPC基础 消息队列 3 信号量通信机制 4 共享内存 信号量基本概念 信号量是操作系统中解决进程或线程同步与互斥的最重要机制之一。Linux内核提供System V的信号量机制,用于实现进程之间通信。 信号量常用系统调用见下表 函数 功能 sem_init 初始化一个信号量 sem_wait 阻塞线程 sem_post 增加信号量的值 sem_destory 释放信号量 * * 信号量集合属性 * * 信号量结构 //come from /usr/src/kernels/’uname -r’/include/linux/sem.h /* One semaphore structure for each semaphore in the system. */ struct sem{ int semval; /* current value */ int sempid; /* pid of last operation */ }; * * 信号量通信机制概念图 * * 创建信号量集合 extern int semget(key_t __key, int __nsems, int __semflg); 第一个参数为key_t类型的key值,一般由ftok函数产生。 第二个参数__nsems为创建的信号量个数,各信号量以数组的方式存储。这个数组用于初始化数组对象。 第三个参数__semflg用来标识信号量集合的权限。如0770,为文件的访问权限类型。 此外,还可以附加以下参数值。这些值可以与基本权限以或的方式一起使用。 //come from /usr/include/bit/ipc.h /*resource get request flags */ #define IPC_CREAT /*create if key is non existent */ #define IPC_EXCL /*fail if key exists */ #define IPC_NOWAIT /*return error on wait */ * * 控制信号量集合、信号量 extern int semctl(int __semid, int __semnum, int __cmd,……) 该函数最多可有四个参数(有可能只有三个参数)。第一个参数__semid为要操作的信号量集合标识符,该值一般由semget函数返回。 第二个参数为集合中信号量的编号。如果标识某个信号量,此值为该信号量的下标(从0到n-1);如果标识整个信号量集合,则设置为0。 第三个参数为要执行的操作,如果是对整个信号量集合,这些操作在/usr/include/linux/ipc.h文件中定义。其操作包括IPC_RMID、IPC_SET、IPC_STAT和IPC_INFO,具体含义同msgctl的相关操作。 * * * * 信号量操作 extern int semop(int __semid, struct sembuf * __sops, size_t __nsops); 此函数第一个参数为要操作的信号量集合标识符,该值一般由semget函数返回。 第二个参数为struct sembuf结构的变量,其定义如下: //come from /usr/include/linux/sem.h /* semop system calls takes an array of these. */ struct sembuf { unsigned short sem_num; /* semaphore index in array */ short sem_op; /*semaphore operation */ short sem_flg; /* operation flags */ } * * 信号量操作(2) 此结构体有三个成员变量。 1) sem_num为操作的信号量编号。 2)sem_op为作用于信号量的操作:该值如果为正整数表示增加信号量的值,如果为负整数表示减小信号量的值,如果为0表示对信号量的当前值进行是否为0的测试。 3)sem_flg为操作标识。 * * 使用信号量实现生产消费问题 生产消费问题是一个经典的数学问题,要求生产者-消费者在固定的仓库空间条件下,生产者每生产一个产品将占用一个仓库空间,生产者生产的产品库存不能越过仓库的存储量,消费者每消费一个产品将增加一个仓库空间,消费者
文档评论(0)