收藏 分享(赏)

Linux操作系统分析13942.ppt

上传人:dreamzhangning 文档编号:2163380 上传时间:2018-09-03 格式:PPT 页数:38 大小:187KB
下载 相关 举报
Linux操作系统分析13942.ppt_第1页
第1页 / 共38页
Linux操作系统分析13942.ppt_第2页
第2页 / 共38页
Linux操作系统分析13942.ppt_第3页
第3页 / 共38页
Linux操作系统分析13942.ppt_第4页
第4页 / 共38页
Linux操作系统分析13942.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、Linux操作系统分析,主讲:陈香兰 助教:贾永泉、毛熠璐 3606864-83(西区电三421) Autumn 2007,进程间同步和通信,xlanchen2007.10.25,xlanchen2007.10.25,Linux Operating Systems analysis,3,进程间通信,IPC,Inter-Process Communication Unix系统提供的基本的IPC包括: 1、管道和FIFO(有名管道) 2、消息 3、信号量 4、共享内存区 5、套接字,xlanchen2007.10.25,Linux Operating Systems analysis,4,1、管

2、道(pipe),管道是所有Unix都提供的一种IPC机制 管道是半双工的,数据只能向一个方向流动; 一个进程将数据写入管道, 另一个进程从管道中读取数据 数据的读出和写入: 写入的内容每次都添加在管道缓冲区的末尾, 每次都是从缓冲区的头部读出数据。 需要双方通信时,需要建立起两个管道; 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);,xlanchen2007.10.25,Linux Operating Systems analysis,5,在shell中使用管道的例子,命令:“ls | more” 使用pipeline “|”将两个命令”ls”和“more”连接起来,使得ls的输出成

3、为more的输入 也可以使用如下的两个命令 命令1:“ls tmp” 命令2:”more tmp” 命令1把ls的输出重定向到tmp文件中; 命令2把more的输入重定向到tmp文件,xlanchen2007.10.25,Linux Operating Systems analysis,6,创建一个管道,管道可看成是被打开的文件,但并没有真实的 文件与之对应 pipe()系统调用用来创建一个新的管道#include int pipe(int filedes2); 管道两端分别用描述符filedes0和filedes1描述 管道两端的功能是固定的: filedes0只能用于读,称为管道读端; f

4、iledes1只能用于写,称为管道写端。 若试图从写端读,或者向读端写都将导致错误发生。 一般文件的I/O函数都可用于管道,如close、read、write等。,xlanchen2007.10.25,Linux Operating Systems analysis,7,使用管道的典型程序,testpipe.c管道只能在具有亲缘关系的进程之间进行通信 通过fork传递管道的描述符 任意的两个进程不可能共享同一个管道 无法打开已经存在的管道,xlanchen2007.10.25,Linux Operating Systems analysis,8,FIFO,管道的一个重大限制是它没有名字,因此

5、只能用于具有亲缘关系的进程间通信,在 有名管道(named pipe或FIFO)提出后, 该限制得到了克服。 FIFO,有名管道 特殊的文件类型: 1,严格遵循先入先出的读写规则 2,类似管道,在文件系统中不存在数据块,而是与一块内核缓冲区相关联 3,有名字,FIFO的名字包含在系统的目录树结构中,可以按名访问,xlanchen2007.10.25,Linux Operating Systems analysis,9,FIFO的操作:以及:open,close,read,write等普通文件操作,xlanchen2007.10.25,Linux Operating Systems analys

6、is,10,FIFO举例,创建一个FIFO:createfifo.c 向FIFO写:writefifo.c 从FIFO读:readfifo.c,xlanchen2007.10.25,Linux Operating Systems analysis,11,createfifo.c,xlanchen2007.10.25,Linux Operating Systems analysis,12,writefifo.c,xlanchen2007.10.25,Linux Operating Systems analysis,13,readfifo.c,xlanchen2007.10.25,Linux Op

7、erating Systems analysis,14,2、消息队列,消息队列就是一个消息的链表。 可以把消息看作一个记录,具有特定的格式以及特定的优先级。 对消息队列有写权限的进程可以按照一定的规则向消息队列添加新消息; 对消息队列有读权限的进程则可以从消息队列中读走消息。,xlanchen2007.10.25,Linux Operating Systems analysis,15,消息队列的创建 int msgget(key_t key, int msgflg) 根据给定的键值,返回对应的消息队列 若能找到,则返回已有的;否则,创建一个新的,xlanchen2007.10.25,Linux

8、 Operating Systems analysis,16,发送消息 int msgsnd(int msqid, /目标消息队列 struct msgbuf *msgp, /待发送的消息 int msgsz, /消息的大小 int msgflg); /标志 对于发送消息来讲,msgflg有意义的标志为 IPC_NOWAIT:指明在消息队列没有足够空间容纳要发送的消息时,msgsnd是否等待,xlanchen2007.10.25,Linux Operating Systems analysis,17,接收消息 int msgrcv(int msqid, /msqid为消息队列描述字 struc

9、t msgbuf *msgp, /消息返回后存储这里 int msgsz, /指定消息内容的长度 long msgtyp, /请求读取的消息类型 nt msgflg); 读消息标志msgflg可以为以下几个常量的或: IPC_NOWAIT:如果没有满足条件的消息,立即返回,此时,errno=ENOMSG IPC_EXCEPT:与msgtyp0配合使用,返回队列中第一个类型不为msgtyp的消息 IPC_NOERROR:如果队列中满足条件的消息内容大于所请求的msgsz字节,则把该消息截断,截断部分将丢失。,xlanchen2007.10.25,Linux Operating Systems a

10、nalysis,18,消息队列的其他操作 int msgctl(int msqid, int cmd, struct msqid_ds *buf); 对由msqid标识的消息队列执行cmd操作: IPC_STAT:获取消息队列信息,返回的信息存贮在buf中; IPC_SET:设置消息队列的属性,要设置的属性存储在buf中;可设置属性包括:msg_perm.uid、msg_perm.gid、msg_perm.mode以及msg_qbytes,同时,也影响msg_ctime成员。 IPC_RMID:删除消息队列,xlanchen2007.10.25,Linux Operating Systems

11、analysis,19,3、信号量,Semphore,用来对资源进行并发控制访问 通常是一个计数器 如果资源可用,值0 如果不可用,值=0 当进程需要访问资源,但资源不可用时,将计数值-1,并阻塞 当进程释放资源,使得资源有资源可用时,就唤醒被阻塞的进程,xlanchen2007.10.25,Linux Operating Systems analysis,20,获得信号量集描述符semop用来获取或释放信号量对应的资源,xlanchen2007.10.25,Linux Operating Systems analysis,21,对semop中sembuf结构的解释,sembuf中包含下列几个

12、分量: unsigned short sem_num; /要操作的信号量的序号 short sem_op; /要进行的操作 short sem_flg; /与操作相关的一些标记 其中,sem_flg可以是 IPC_NOWAIT:当期望的操作无法完成时,直接返回 和SEM_UNDO:自动释放标记 sem_op的值确定要进行的操作 0:释放资源 =0:wait-for-zero 0:申请资源,xlanchen2007.10.25,Linux Operating Systems analysis,22,Semctl对信号量进行控制,可以用来删除一个信号量第4个参数可选,是一个union,其含义根据c

13、md进行解释,union semun int val;struct semid_ds *buf;unsigned short * array;struct seminfo *_buf; ,xlanchen2007.10.25,Linux Operating Systems analysis,23,对semctl中cmd等的解释,cmd可以是: IPC_STAT,将信号量集的信息复制到第四个参 数所提示的空间中,此时第四个参数为:struct semid_ds *buf。此时第二个参数无用 IPC_SET,与上一个操作相反 IPC_RMID,删除信号量集,不使用第四个参数 GETALL/SETA

14、LL,使用第四个参数:unsigned short* array,获取/设置所有信号量的值 GETVAL/SETVAL,前者使用第4个参数:int val,获得/设置指定信号量的值 GETNCNT、GETPID、GETZCNT,xlanchen2007.10.25,Linux Operating Systems analysis,24,Cmd使用举例,union semun args; args.val=1; semctl(sem_id,sem_no,SETVAL,args); int i=semctl(sem_id,sem_no,GETVAL); semctl(sem_id,sem_no,I

15、PC_RMID);,xlanchen2007.10.25,Linux Operating Systems analysis,25,使用信号量互斥,usesem.c注意:示例程序仅仅是为了说明进程之间的互斥,xlanchen2007.10.25,Linux Operating Systems analysis,26,4、共享内存,允许两个或多个进程通过把公共数据放入一个共享内存区来访问它们,获得或创建一个共享内存区的IPC标志符,将一个共享内存区“附加”到一个进程上, 使得进程可以访问共享内存区的内容 进程通过shmaddr指定并获得共享内 存区在该进程中的起始地址,将指定位置的共享内存区从进程

16、中分离出去,xlanchen2007.10.25,Linux Operating Systems analysis,27,两个进程通过共享内存进行通信 testshm.c testshm2.c,xlanchen2007.10.25,Linux Operating Systems analysis,28,5、套接字socket,套接字不仅可以用来实现网络间的进程通信,也可以用来实现本地的进程间通信 相关调用包括: Socket Listen Bind Connect/accept Send/recv,read/write Close ,xlanchen2007.10.25,Linux Opera

17、ting Systems analysis,29,Socket建立一个套接字,对于基于TCP/IP的编程,通常为: sockfd=socket(AF_INET, SOCK_STREAM,0),xlanchen2007.10.25,Linux Operating Systems analysis,30,地址绑定,将一个套接字与一个地址绑定网络地址:,struct sockaddr unsigned short sa_family; char sa_data14; ;,address family 例如:AF_INET,14 个字节,协议地址,xlanchen2007.10.25,Linux Op

18、erating Systems analysis,31,Internet的地址,struct sockaddr_in /* for convenience */short int sin_family; unsigned short int sin_port; /* 2 bytes */struct in_addr sin_addr;/* 4 bytes */unsigned char sin_zero8; ; sin_port和sin_addr要使用网络字节序,跟主机上的不一定一致,需要转换: htons=host to net short htonl=host to net long,xl

19、anchen2007.10.25,Linux Operating Systems analysis,32,Server端需要进行地址绑定,int sd; struct sockaddr_in my_addr; sd = socket(AF_INET, SOCK_STREAM, 0); bzero(bind填写了服务器的地址和端口信息,最大的端口值为65535,xlanchen2007.10.25,Linux Operating Systems analysis,33,服务器调用listen设置侦听,第二个参数指定最多客户数 listen(sd,5); listen将立即返回,xlanchen2

20、007.10.25,Linux Operating Systems analysis,34,服务器调用accept接收客户连接请求,sin_size = sizeof(struct sockaddr_in);newsd = accept(sd, Accept将会blocking直到有客户连接 返回与客户端相关的newsd,并将客户端的信息存放在their_addr中,xlanchen2007.10.25,Linux Operating Systems analysis,35,TCP服务器编程模型,socket(.); bind(.); listen(.); while(1) /循环服务器 ac

21、cept(.); while(1) read(.); process(.); write(.); close(.); ,xlanchen2007.10.25,Linux Operating Systems analysis,36,客户端调用connect请求连接,在serv_addr中指明要连接的服务器地址和端口 成功以后,就可以进行send/recv或者read/write了,xlanchen2007.10.25,Linux Operating Systems analysis,37,struct sockaddr_in dest_addr; sd = socket(AF_INET, SOCK_STREAM, 0); bzero(,xlanchen2007.10.25,Linux Operating Systems analysis,38,TCP客户端编程模型,socket() connect() while(1) read()write() close(),

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 往来文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报