已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
进程间通信 进程间通信概述 进程间通信有如下一些目的 数据传输 一个进程需要将它的数据发送给另一个进程 共享数据 多个进程想要操作共享数据 一个进程对共享数据的修改 别的进程应该立刻看到 通知事件 一个进程需要向另一个或一组进程发送消息 通知它 它们 发生了某种事件 如进程终止时要通知父进程 资源共享的同步 多个进程之间共享同样的资源 为了作到这一点 需要内核提供锁和同步机制 进程控制 有些进程希望完全控制另一个进程的执行 如Debug进程 此时控制进程希望能够拦截另一个进程的所有陷入和异常 并能够及时知道它的状态改变 进程间通信概述 linux进程间通信 IPC 由以下几部分发展而来 早期UNIX进程间通信 基于SystemV进程间通信 基于Socket进程间通信和POSIX进程间通信 UNIX进程间通信方式包括 管道 FIFO 信号 SystemV进程间通信方式包括 SystemV消息队列 SystemV信号灯 SystemV共享内存 POSIX进程间通信包括 posix消息队列 posix信号灯 posix共享内存 进程间通信概述 现在linux使用的进程间通信方式 1 无名管道 pipe 和有名管道 FIFO 2 消息队列 3 共享内存 4 信号量 5 信号 signal 6 套接字 socket 信号概述 信号是软件中断 信号 signal 机制是Unix系统中最为古老的进程之间的通信机制 它用于在一个或多个进程之间传递异步信号 产生信号 当用户按某些终端键时 可以产生信号 例如 在终端上按Ctrl C键通常产生中断信号 SIGINT 这是停止一个已失去控制程序的方法 硬件异常产生信号 除数为0 无效的存储访问等等 这些条件通常由硬件检测到 并将其通知内核 然后内核为该条件发生时正在运行的进程产生适当的信号 例如 对执行一个无效存储访问的进程产生一个SIGSEGV Linux中的信号 下面是几个常见的信号 SIGHUP 从终端上发出的结束信号 SIGINT 来自键盘的中断信号 Ctrl C SIGQUIT 来自键盘的退出信号 Ctrl SIGFPE 浮点异常信号 例如浮点运算溢出 SIGKILL 该信号结束接收信号的进程 SIGALRM 进程的定时器到期时 发送该信号 SIGTERM kill命令发出的信号 SIGCHLD 标识子进程停止或结束的信号 SIGSTOP 来自键盘 Ctrl Z 或调试程序的停止执行信号 信号 信号 可以要求系统在某个信号出现时按照下列三种方式中的一种进行操作 1 忽略此信号 大多数信号都可使用这种方式进行处理 但有两种信号却决不能被忽略 它们是 SIGKILL和SIGSTOP 这两种信号不能被忽略的原因是 它们向超级用户提供一种使进程终止或停止的可靠方法 另外 如果忽略某些由硬件异常产生的信号 例如非法存储访问 则进程的行为是未定义的 2 捕捉信号 为了做到这一点要通知内核在某种信号发生时 调用一个用户函数 在用户函数中 可执行用户希望对这种事件进行的处理 如果捕捉到SIGCHLD信号 则表示子进程已经终止 所以此信号的捕捉函数可以调用waitpid以取得该子进程的进程ID以及它的终止状态 3 执行系统默认动作 对大多数信号的系统默认动作是终止该进程 信号处理函数 include sighandler tsignal int sig sighandler t handler 功能 信号处理函数 返回值 成功返回可用信号处理函数 失败返回SIG ERR 参数 sig 要捕获的信号 handler 信号处理函数 还可以是以下取值 SIG IGN屏蔽该信号SIG DFL恢复默认行为注 该函数简单但可靠性低 可由sigaction 代替 信号处理函数 includeintkill pid t pid int sig 功能 发送信号到进程 返回值 成功返回0 否则返回 1 includeintalarm unsignedint seconds 功能 在 secends秒后发送SIGALARM信号 若 secends为0 则取消已设置闹铃 返回值 成功返回上一个闹铃还剩余多长时间 失败返回 1 管道通信 管道通信例如 ps grepvsftpd管道是单向的 先进先出的 无结构的字节流 它把一个进程的输出和另一个进程的输入连接在一起 写进程在管道的尾端写入数据 读进程在管道的首端读出数据 数据读出后将从管道中移走 其它读进程都不能再读到这些数据 管道提供了简单的流控制机制 进程试图读空管道时 在有数据写入管道前 进程将一直阻塞 同样 管道已经满时 进程再试图写管道 在其它进程从管道中移走数据之前 写进程将一直阻塞 管道主要用于不同进程间通信 管道通信 管道有一些固有的局限性 因为读数据的同时也将数据从管道移去 因此 管道不能用来对多个接收者广播数据 管道中的数据被当作字节流 因此无法识别信息的边界 如果一个管道有多个读进程 那么写进程不能发送数据到指定的读进程 同样 如果有多个写进程 那么没有办法判断是它们中那一个发送的数据 管道函数 includeintpipe intfd 2 功能 创建一个简单的管道 若成功则为数组fd分配两个文件描述符 其中fd 0 用于读取管道 fd 1 用于写入管道 返回值 成功返回0 失败返回 1 pipe调用成功后的状况 管道 续 fd 1 fd 0 管道 内核 单个进程中的管道 fd 1 fd 0 管道 父子进程共享的管道 fd 1 fd 0 内核 父进程 子进程 fd 1 管道 fd 0 内核 父进程 子进程 父子进程共享的管道 管道写端关闭 读端再读取管道时将返回0管道读端关闭 写端再写管道时将产生sigpipe信号 该信号的默认行为是结束进程 有名管道 FIFO 有名管道和一般的无名管道基本相同 但也有一些显著的不同 有名管道是在文件系统中作为一个特殊的文件而存在的 不同祖先的进程之间可以通过有名管道共享数据 当共享管道的进程执行完所有的I O操作以后 有名管道将继续保存在文件系统中以便以后使用 无名管道只能由相关进程使用 它们共同的祖先进程创建了管道 但是 通过FIFO 不相关的进程也能交换数据 创建命名管道 include includeintmkfifo constchar pathname mode tmode 功能 创建命名管道返回 若成功则为0 若出错则为 1 共享内存 共享内存区域是被多个进程共享的一部分物理内存 如果多个进程都把该内存区域映射到自己的虚拟地址空间 则这些进程就都可以直接访问该共享内存区域 从而可以通过该区域进行通信 共享内存是进程间共享数据的一种最快的方法 一个进程向共享内存区域写入了数据 共享这个内存区域的所有进程就可以立刻看到其中的内容 共享内存 共享内存原理示意图 共享内存 includeintshmget key t key size t size int shmflg 功能 创建共享内存 返回值 成功返回共享内存标识码 失败返回 1 参数 key 标识共享内存的键值 size 要建立共享内存的长度 shmflg 标志 其中有效的包括 IPC CREAT如果共享内存不存在 则创建一个共享内存 否则获得该共享内存 IPC EXCL只有在共享内存不存在的时候 新的共享内存才建立 否则就产生错误 共享内存 includevoid shmat intshmid constvoid shmaddr intshmflg 功能 允许进程访问一块共享内存 共享内存刚创建时不能使用 即 映射一块共享内存 返回值 成功返回共享内存的虚拟地址起始地址 失败返回 1 参数 shmid是共享内存的ID shmaddr是共享内存在本进程内的起始地址shmflag是本进程对该内存的操作模式 如果是SHM RDONLY的话 就是只读模式 共享内存 includeintshmdt constvoid shmaddr 功能 断连共享内存区的映射 返回值 成功时返回0 失败时返回 1 参数 shmaddr是共享内存的虚拟地址起始地址 共享内存 includeintshmctl int shmid int cmd structshmid ds buf 功能 共享内存控制函数 返回值 成功返回0 失败返回 1 参数 shmid 共享内存的ID cmd 允许的操作 最常用的包括 IPC RMID删除共享内存段 buf 保存内存模式状态和访问权限的数据结构 通常为0 共享内存 利用共享内存进行进程间通信的实例利用共享内存进行进程间通信时存在的同步问题如何解决 信号量 信号量 semaphore includeintsemget key t key int nsems int semflg 功能 创建一个新的信号量或取得一个新的信号量 返回值 成功返回信号量标志码 失败返回 1 参数 key 整型值 其它进程访问信号量的依据 nsems 信号量个数 一般为1 semflg 标志 类似open 的标志 相当于文件的访问权限 信号量 includeintsemctl int semid int semnum int cmd 功能 控制信号量信息 返回值 成功返回0 否则 1 参数 semid 信号量标志码 semnum 信号量编号 cmd 要进行的操作 第四个参数 是unionsemun的实例 具体值依赖 cmd 信号量 cmd允许的命令 IPC STAT读取一个信号量集的数据结构semid ds 并将其存储在semun中的buf参数中 IPC SET设置信号量集的数据结构semid ds中的元素ipc perm 其值取自semun中的buf参数 IPC RMID将信号量集从内存中删除 GETALL用于读取信号量集中的所有信号量的值 GETNCNT返回正在等待资源的进程数目 GETPID返回最后一个执行semop操作的进程的PID GETVAL返回信号量集中的一个单个的信号量的值 GETZCNT返回这在等待完全空闲的资源的进程数目 SETALL设置信号量集中的所有的信号量的值 SETVAL设置信号量集中的一个单独的信号量的值 信号量 includeintsemop int semid structsembuf sops size t nsops 功能 用户改变信号量的值 返回值 成功返回0 否则 1 参数 semid 信号量标志码 sops 结构体指针 包含了具体操作 nsops 结构体数量 等于1 信号量 structsembuf unsignedshortsem num shortsem op shortsem flg 这三个字段的意义分别为 sem num 操作信号在信号集中的编号 第一个信号的编号是0 sem op 如果其值为正数 该值会加到现有的信号内含值中 通常用于释放所控资源的使用权 如果sem op的值为负数 而其绝对值又大
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46960-2025声学次声测量的频率计权特性
- 网格员考试题目及答案
- 幼儿园小班快乐的元宵节教案
- 2022~2023焊工考试题库及答案第76期
- 电力建筑消防技术要领
- 脑病科健康科普
- 射频消融考试试题及答案
- 社会学文化考试题及答案
- 轻氧化钠化学试题及答案
- 一般墙体砌筑交底
- 2026年乡村医生传染病考试题含答案
- 新零售模式下人才培养方案
- 上海市徐汇区2026届初三一模化学试题(含答案)
- 预中标协议书电子版
- 龟的解剖课件
- 2025年碳排放管理师考试试题及答案
- 八年级英语教学设计案例分析Unit3
- 2025年高尔基《童年》阅读测试+答案
- 95-1轻机枪射击课件
- 跟单转正述职报告
- 中资企业在泰国发展报告(2024-2025)-境外商会联席会议-202509
评论
0/150
提交评论