- 1、本文档共49页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分类 二值信号灯:信号灯的值只能取0或1,类似于互斥锁。 但两者有不同:信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁。 计数信号灯:信号灯的值可以取任意非负值。 共享内存 共享内存 共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。 共享内存实现步骤 一、创建共享内存,使用shmget函数。 二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。 创建 int shmget ( key_t key, int size, int shmflg ) key标识共享内存的键值: 0/IPC_PRIVATE。 当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。 返回值:如果成功,返回共享内存标识符;如果失败,返回-1。 映射 int shmat ( int shmid, char *shmaddr, int flag) 参数: shmid:shmget函数返回的共享存储标识符 flag:决定以什么方式来确定映射的地址(通常为0) 返回值: 如果成功,则返回共享内存映射到进程中的地址;如果失败,则返回- 1。 删除 当一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。 int shmdt ( char *shmaddr ) * * 进程间通信机制的分析与比较 Ve0.1 为什么进程间需要通信? 1、数据传输 一个进程需要将它的数据发送给另一个进程。 2、资源共享 多个进程之间共享同样的资源。 3、通知事件 一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件。 4、进程控制 有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有操作,并能够及时知道它的状态改变。 分 类 进程间通信方式包括: 1、管道(pipe)和有名管道(FIFO) 2、信号(signal) 3、消息队列 4、共享内存 5、信号量 6、套接字(socket) 信号 信号通信 信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号: 1、当用户按某些按键时,产生信号。 2、硬件异常产生信号:除数为0、无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。 3、进程用kill函数将信号发送给另一个进程。 4、用户可用kill命令将信号发送给其他进程。 信号类型 下面是几种常见的信号: SIGHUP: 从终端上发出的结束信号 SIGINT: 来自键盘的中断信号(Ctrl-C) SIGKILL:该信号结束接收信号的进程 SIGTERM:kill 命令发出的信号 SIGCHLD:标识子进程停止或结束的信号 SIGSTOP:来自键盘(Ctrl-Z)或调试程序的停止执行信号 信号处理 当某信号出现时,将按照下列三种方式中的一种进行处理: 1、忽略此信号 大多数信号都按照这种方式进行处理,但有两种信号却决不能被忽略。它们是:SIGKILL和SIGSTOP。这两种信号不能被忽略的原因是:它们向超级用户提供了一种终止或停止进程的方法。 2、执行用户希望的动作 通知内核在某种信号发生时,调用一个用户 函数。在用户函数中,执行用户希望的处理。 3、执行系统默认动作 对大多数信号的系统默认动作是终止该进程。 信号通信机制的局限性 这种通信方式主要的局限性就是开销太大,发送进程需要调用系统调用,这时核心会中断接收进程,且要管理它的堆栈、调用处理程序、恢复被中断的接收信号进程等.另外,信号的数量受到限制,并且只能传送有限的信息量,例如不能携带参数等。所以对于复杂的通信操作不适用。 管道通信 什么是管道? 管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。 数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。 样例:ls -l | less 在这个例子中,ls用于在Unix下列出目录内容,less是一个有搜索功
文档评论(0)