- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UnixLinux下的IPC---旌旗灯号量集
Unix/Linux下的IPC---信号量集??
2010-01-05 12:28:50|??分类: HYPERLINK /blog/ \l m=0t=1c=fks_080075087094082071087085074075080082085065087083 \o C/VC/C++ C/VC/C++ |??标签: |字号大中小?订阅
最初的Unix IPC包括:管道、FIFO、信号;System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;POSIX IPC包括:POSIX消息队列、POSIX信号灯、POSIX共享内存区;由于Unix系统版本的多样性,电子电气工程协会(IEEE)开发了一套独立的Unix标准,这套新的ANSI Unix标准被称为计算机环境的可移植操作系统接口(POSIX:Portable Operation System Interface).现有大部分Unix和流行的版本都遵循POSIX标准;而Linux从一开始就遵循了POSIX标准;
System V IPC对象属于系统内核对象,执行同步操作的时候,系统内核参与完成了大部分操作,所以它是一套重量级同步对象;POSIX IPC对象属于用户进程对象,执行同步操作的时候,不需要系统内核参与,所以它是一套轻量级同步对象;一般来说,使用POSIX IPC来控制对共享资源的访问,就足够了;
典型的IPC对象:管道、命名管道、信号、信号灯、信号量集、消息队列、共享内存;下面仅介绍信号量集、共享内存;
一、信号量集:POSIX IPC标准对信号量的的要求并不高:信号量(sem_init)、命名信号量(sem_open);System V IPC要求信号量必须是一个集合,即:信号量集;信号量集和信号量一样,都是为了控制多个进程对共享资源的同步访问而引入的同步对象;System V IPC中规定:不能只单独定义一个信号量,而是只能定义一个信号量的集合,即:信号量集,其中包含一组信号量,同一信号量集中的多个信号量使用同一个唯一的ID来引用,这样做的目的是为了对多个共享资源进行同步控制的需要;
1、信号量集的创建与打开:?? 系统调用semget()用于创建一个新的信号量集,或者是存取一个已经存在的信号量集;?? 函数原型: int semget(key_t key, int nsems, int semflag);?? 参数说明: key???? -- 需要创建或打开的信号量集的键,用于唯一地标记一个信号量集;这个参数是用户程序可以直接访问的用户态参数;???????????? nsems?? -- 表示待创建的信号量集key中的信号量的个数,这个参数只在创建信号量集的时候有效;???????????? semflag -- 表示调用函数的操作类型,也可以用于设置信号量集的访问权限,两者通过逻辑或(or)表示;?? 返回值:成功:返回一个正数,这个正数也用于唯一地标记已经创建或打开的信号量集,这个唯一标示由系统内核使用;这个正数被称为是IPC标识符;????????? 失败:返回-1;并设置错误码errno来标记错误原因:?????????????? EEXIST(信号量集已经存在,无法创建)?????????????? EIDRM(信号量集已经删除)?????????????? ENOENT(信号量集不存在,同时没有使用IPC_CREAT)?????????????? ENOMEM(没有足够的内存创建新的信号量集)?????????????? ENOSPC(超出限制)?? 当调用semget()创建一个信号量集的时候,信号量集的semid_ds结构会被初始化;ipc_perm中的各个量被设置为相应的值;sem_nsems被设置为参数nsems的值;sem_otime被设置为0,sem_ctime被设置为当前时间;?? 系统调用semget()的第一个参数是关键字值(一般由系统调用ftok()返回的).系统内核将此值和系统中存在的其它的信号量集的关键字值进行比较,不存在的话,则直接创建这个新的信号量集,如果已经存在同关键字值的信号量集,则直接打开这个信号量集,不必再新建信号量集;打开和存取操作与参数semflag有关.IPC_CREAT:如果待创建的信号量集在系统内核中不存在,则创建信号量集;IPC_EXCL与IPC_CREAT同时使用时,如果信号量集在系统内核中已经存在,则调用失败;如果单独使用IPC_CREAT,则系统调用semget()要么返回新创建的信号量集的标识符,要么返回系统内核中已经存在的具有相同关键字值的信号量集的标识符;如果IPC_EXCL与IPC_CREA
文档评论(0)