网站大量收购独家精品文档,联系QQ:2885784924

信号量及共享内存.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
信号量(semaphore)Kless0329 (实现同步) 一种是系统调用,一种是调用linux库函数 信号量实现同步: A B两个程序打印AA BB 使每一次都连着打印A或B 只需一对信号量val= 1 A(p(0),v(0)) B(p(0),v(0)) p(0):是对val值为0的信号量进行p操作 AB两个程序进行读写同步,A写一个,B读一个,需要两对信号量(val= 1和val = 0,A( p(1),v(0) ) B( p(0),v(1) ) ) 系统调用(2) sys/sem.h 创建信号量(semget),成功后设置信号量的值(semctl) == 另一个进程获取信号量 进行pv操作(semop) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 通过key获取semid pv 操作就是对senbuf 里面的内容进行改动sem_num 只有一个,所以下标就是0 删除时是删除信号量集 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 删除信号量(semctl) 注意:删除操作必须在pv操作结束后进行(与共享内存对比) 只需删除一次,不论在哪个进程中删除都可以 1、创建 2、操作 3、删除 二、调用库函数(3) semaphore.h value :信号量的初始化值 和大多数linux函数一样,这些函数成功是返回0,失败时返回-1 命令删除 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 如果 Pv操作中 Struct sembuf buf; Buf.sem_flg = SEM_UNDO; // SEM_NOWAIT 不赋值就会在程序结束后系统自动删掉 (如果将pv操作中的Buf.sem_flg = SEM_UNDO; 则必须在完成各种操作之后删除,因为如果不删除,程序结束后,系统不会自动 共享内存 kless0402 (实现进程间的通信(IPC) 有三个:管道,信号,共享内存) 系统调用(2) sys/shm.h 每个进程都有自己的逻辑地址 共享内存:一个物理内存被多个进程来访问 目的:是用来进行进程之间通信,(信号,共享内存,管道) 创建:专门开辟一个某个大小的内存,用来作为共享内存 达到共享内存需要的函数 Shmget: 全新创建,或是获取 Shmat: 将共享内存映射到某个进程 shm_addr = NULL 原因:该进程的某个位置,让他自动判断,因为和硬件关联度大 Shmdt: 断开,使内存不映射到该进程 Shmctl: “删除内存” cmd = IPC_RMID (可以在断开之前删除,与信号量对比) 5、只需删除一次 (可以在断开之前删除) 若程序结束后,未删除,系统不会自动删除 7、不断开,会自动断开,但不会删除,不论在那个映射的进程中删除都可以 8、linux服务器中,我用命令ipcs 去查看时,看到如下数据 key shmid owner perms bytes nattch status ox00 3501612 root 600 384 dest ox00 3501613 apache 666 10000 0 dest 表示共享内存段已经被删除,但是仍然有程序在连接着它 “status栏中列出当前共享内存的状态,当该段内存的mode字段设置了SHM_DEST位时就会显示dest字样, 当用户调用shmctl的IPC_RMID时,内核首先看有多少个进程还和这段内存关联着,如果关联数为0,就会销毁(释放)这段内存,否则就设置这段内存的mode位SHM_DEST,” 2、映射(shmat()) 3、删除(shmctl())(可将buf置为NULL

文档评论(0)

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

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

1亿VIP精品文档

相关文档