收藏 分销(赏)

进程间通信.pptx

上传人:人****来 文档编号:4173438 上传时间:2024-08-11 格式:PPTX 页数:31 大小:293KB 下载积分:12 金币
下载 相关 举报
进程间通信.pptx_第1页
第1页 / 共31页
进程间通信.pptx_第2页
第2页 / 共31页


点击查看更多>>
资源描述
第第3章内容回顾章内容回顾了解进程和线程基本概念掌握进程编程掌握线程编程第第第第4 4章章章章进程间通信进程间通信进程间通信进程间通信预习检查预习检查进程间通信的方法有?信号、文件锁、管道、FIFO、信号量、共享内存、消息队列哪一种方法最有效,最快?共享内存哪些方法是system V IPC?信号量、共享内存、消息队列必须要求是亲属进程间才能通信的方法是?管道本章目标本章目标了解Unix/Linux进程间通信的方式掌握和熟练运用常见的IPC方式信号管道和FIFO信号量消息队列共享内存本章结构本章结构信号信号 进程间通信进程间通信管道管道/FIFO 信号响应、处理与发送信号响应、处理与发送 信号机制信号机制 管道的概念管道的创建与读写管道的创建与读写FIFO 消息队列的创建与操作消息队列的创建与操作 信号量的创建与操作 信号量综合示例信号量综合示例 综合示例msgtool 共享内存的创建与操作 综合示例综合示例shmtool信号量 消息队列消息队列共享内存共享内存 信号信号信号(signal)机制是Linux系统中最为古老的进程之间的通信机制信号事件的发生有两个来源:硬件来源,比如我们按下了键盘或者其它硬件故障;软件来源,最常用发送信号的系统函数是kill(),raise(),alarm()和setitimer()等函数,软件来源还包括一些非法运算等操作。进程对信号的处理进程对信号的处理进程可以通过三种方式来响应和处理一个信号:忽略信号捕捉信号执行缺省操作 信号处理函数的安装信号处理函数的安装#includevoid(*signal(int sig,void(*func)(int)(int);如果func不是函数指针,必须是下列两个宏:SIG_IGN:忽略信号。SIG_DEF:采用系统默认的方式处理信号,执行缺省操作。返回值:返回先前的信号处理函数指针,如果有错误则返回-1。要安装的信号值信号的处理函数 信号的发送信号的发送除了内核和超级用户,并不是每个进程都可以向其他的进程发送信号。一般的进程只能向具有相同uid和gid的进程发送信号,或向相同进程组中的其他进程发送信号。常用的发送信号的函数有kill()、raise()、alarm()、setitimer()、abort()等。信号的发送信号的发送kill()函数:给指定的进程发送某一个信号#include#include int kill(pid_t pid,int sig);返回值:成功为0;失败返回-1。接收信号的进程id要发送的信号值信号的发送信号的发送raise()函数:给进程本身发送一个信号#include int raise(int sig);相当于kill(getpid(),sig);返回值:成功为0;失败返回-1。要发送的信号值信号的发送信号的发送alarm()函数:是一个简单定时器,专为SIGALRM信号设计#include unsigned int alarm(unsigned int seconds);在指定的seconds秒之后,给进程本身发生一个SIGALRM信号定时器的定时时间管道管道管道是针对于本地计算机的两个进程之间的通信而设计的通信方法,管道建立后,实际获得两个文件描述符:一个用于读取而另外一个用于写入。管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立起两个管道。只能用于父子进程或者兄弟进程之间(具有亲缘关心的进程)。单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是单独构成一种文件系统,并且只存在于内存中。数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。管道的创建管道的创建系统调用pipe()用于创建一个管道int pipe(int filedes2);建立管道:filedes0:为pipe的读出端filedes1:为pipe的写入端两个文件描述符数组。文件描述符FIFOFIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中 在文件系统中是一个有名字的管道任何进程都可以打开进程间无需关联FIFO的创建的创建#include#include int mkfifo(const char*pathname,mode_t mode);文件路径名文件权限信号量信号量System IPC中,对于每一个新建的信号量、消息队列以及共享内存,都有一个在整个系统中唯一的标识符。每个标识符也都有唯一对应的关键字,关键字的数据类型由系统定义为key_t。alexalex-/work/tutorail$ipcs-Shared Memory Segments-key shmid owner perms bytes nattch status 0 x00000000 229376 user 600 393216 2 dest 0 x00000000 262145 user 600 393216 2 dest 0 x00000000 163842 user 600 393216 2 dest -Semaphore Arrays-key semid owner perms nsems 0 x6406f9da 3080201 alex 600 1-Message Queues-key msqid owner perms used-bytes messages 0 x80600001 0 alex 600 16361 226 创建创建/获取信号量获取信号量#include#include#include int semget(key_t key,int nsems,int semflg);Key:键值1.指定键值2.IPC_PRIVATE系统指定键值nsems:信号量的数目信号量集合的数目Smeflg:信号量标志1.IPC_CREATE如果内核中没有此队列,则创建它。2.IPC_EXECL当和IPC_CREAT一起使用时,如果队列已经存在,则返回错误。3.mode_flags:类似于文件的权限信号量操作信号量操作当进程需要申请或者释放公共资源的时候,可以调用semop()来对信号量进行操作#include#include#include int semop(int semid,struct sembuf*sops,unsigned nsops);sops:指向sembuf结构的数组指针unsigned short sem_num:组中包含的信号量数量short sem_op:操作类型的整数整数:加到信号量的值上负数:信号量的值减去绝对值,如果小于零,进程阻塞,直到信号量的值至少等于其绝对值0:导致操作阻塞,直到信号量的值为0才继续。short sem_flg:一个符号位IPC_NOWAIT:非阻塞操作IPC_UNDO:进程退出的时候自动撤销该次操作nsops:第二个参数数组的长度信号量控制信号量控制信号量控制#include#include#include int semctl(int semid,int semnum,int cmd,.);信号量集合中的信号量操作类型消息队列消息队列消息队列是系统内核地址空间中的一个内部的链表。消息可以按照顺序发送到队列中,也可以以几种不同的方式从队列中读取。每一个消息队列用一个唯一的IPC标识符表示。Msgbuf数据结构数据结构 struct msgbuf long mtype;/*type of message,must 0*/char mtext1;/*message text*/;mtype指消息的类型,它由一个整数来代表,并且它只能是大于0的整数。mtext是消息数据本身。创建消息队列创建消息队列#include#include#include int msgget(key_t key,int msgflg);Key:键值1.指定键值2.IPC_PRIVATE系统指定键值msgflg:信号量标志1.IPC_CREATE如果内核中没有此队列,则创建它。2.IPC_EXECL当和IPC_CREAT一起使用时,如果队列已经存在,则返回错误。3.mode_flags:类似于文件的权限发送和接收消息发送和接收消息 msgsnd()系统调用用于向队列发送一条消息:int msgsnd(int msqid,struct msgbuf*msgp,size_t msgsz,int msgflg);msgrcv()系统调用用于从消息队列读取一条消息:ssize_t msgrcv(int msqid,struct msgbuf*msgp,size_t msgsz,long msgtyp,int msgflg);消息队列标识符消息缓冲区指针消息大小 0:阻塞IPC_NOWAIT:非阻塞消息的类型 消息队列的控制消息队列的控制 通过msgctl()可以对消息队列进行控制或者一些属性的修改:int msgctl(int msqid,int cmd,struct msqid_ds*buf);cmd:消息队列的操作IPC_STAT:读取消息队列的数据结构msqid_ds,并将其存储在buf指定的地址中。IPC_SET:设置消息队列的数据结构msqid_ds中的ipc_perm、msg_qbytes、msg_ctime元素的值。这个值取自buf参数。IPC_RMID:从系统内核中移走消息队列。消息队列标识符消息队列属性结构体共享内存共享内存两个不同进程A、B共享内存的基本原理是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然 创建和获取共享内存创建和获取共享内存系统调用shmget()用于创建共享内存或者获取一个已经存在的共享内存的标识符:int shmget(key_t key,size_t size,int shmflg);key:键值1.指定键值2.IPC_PRIVATE系统指定键值size:共享内存大小msgflg:共享内存标志1.IPC_CREATE如果内核中没有此队列,则创建它。2.IPC_EXECL当和IPC_CREAT一起使用时,如果队列已经存在,则返回错误。3.mode_flags:类似于文件的权限创建和获取共享内存创建和获取共享内存系统调用shmat()可以获取一个共享内存的地址,并将其连接到进程中:void*shmat(int shmid,const void*shmaddr,int shmflg);shmid:由shmget返回的共享内存标志shmaddr:映射该共享内存块的进程内存地址如果为NULL,Linux将自动选择合适的地址shmflg:SHM_RNDSHM_RDONLY创建和获取共享内存创建和获取共享内存通过shmctl()可以对消息队列进行控制或者一些属性的修改:int shmctl(int shmid,int cmd,struct shmid_ds*buf);cmd:共享内存的操作IPC_STAT:读取一个共享内存的数据结构shmid_ds,并将其存储在buf指定的地址中。IPC_SET:设置消息队列的数据结构shmid_ds中各个元素的值。这个值取自buf参数。IPC_RMID:把共亨内存标记为可删除,当最后一个进程脱连此共享内存的时候,系统将删除该共享内存。共享内存标识符共享内存属性结构体本章总结本章总结信号信号 进程间通信进程间通信管道管道/FIFO 信号响应、处理与发送信号响应、处理与发送 信号机制信号机制 管道的概念管道的创建与读写管道的创建与读写FIFO 消息队列的创建与操作消息队列的创建与操作 信号量的创建与操作 信号量综合示例信号量综合示例 综合示例msgtool 共享内存的创建与操作 综合示例综合示例shmtool信号量 消息队列消息队列共享内存共享内存 共享内存的模型,它是最有共享内存的模型,它是最有效率的进程间通信方式效率的进程间通信方式进程间信号量是进程间同进程间信号量是进程间同步主要方式,信号量操作步主要方式,信号量操作为负的时候,进程阻塞。为负的时候,进程阻塞。直到信号量为正直到信号量为正管道是亲戚进程间通信的管道是亲戚进程间通信的常用方式,常用于输入输常用方式,常用于输入输出重定向出重定向Fifo也成为命名管道,可也成为命名管道,可用于无关联进程之间用于无关联进程之间唯一的异步通信机制唯一的异步通信机制实验及实验注意事项实验及实验注意事项任务1:使用signal()捕捉信号 任务2:使用kill()函数发送信号 任务3:使用raise()函数发送一个信号 任务4:使用管道传送数据任务5:使用FIFO来传送数据 任务6:信号量综合案例 任务7:消息队列任务8:共享内存
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服