实验3:进程通信

上传人:kms****20 文档编号:37422527 上传时间:2018-04-16 格式:DOC 页数:6 大小:72.50KB
返回 下载 相关 举报
实验3:进程通信_第1页
第1页 / 共6页
实验3:进程通信_第2页
第2页 / 共6页
实验3:进程通信_第3页
第3页 / 共6页
实验3:进程通信_第4页
第4页 / 共6页
实验3:进程通信_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《实验3:进程通信》由会员分享,可在线阅读,更多相关《实验3:进程通信(6页珍藏版)》请在金锄头文库上搜索。

1、实验 3:进程通信一、实验目的和要求一、实验目的和要求1、学习进程通信机制的相关知识,建立调用者/服务者的关系。2、了解什么是信号,熟悉 LINUX 系统中进程之间软中断通信的基本原理。2、通过编程实验在两个进程之间实现进程间共享存储区通信。3、深入掌握 Linux 操作系统下的进程间通信的相关方法。二、实验内容二、实验内容1、编写程序:用 fork( )创建两个子进程,再用系统调用 signal( )让父进程捕捉键盘上来的中断信号(即按c 键) ;捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child process1 i

2、s killed by parent!Child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息后终止:Parent process is killed!2、编制一长度为 1k 的共享存储区的包含发送和接收的程序。三、实验指导三、实验指导一、信号一、信号 1、信号的基本概念 每个信号都对应一个正整数常量(称为 signal number,即信号编号。定义在 系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类 型,用于通知某进程发生了某异常事件。每个进程在运行时,都要通过信号机 制来检查是否有信号到达。若有,便中断正在执行的程序,

3、转向与该信号相对 应的处理程序,以完成对该事件的处理;处理结束后再返回到原来的断点继续 执行。实质上,信号机制是对中断机制的一种模拟,故在早期的 UNIX 版本中 又把它称为软中断。 信号与中断的相似点: (1)采用了相同的异步通信方式; (2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相 应的处理程序; (3)都在处理完毕后返回到原来的断点;(4)对信号或中断都可进行屏蔽。 信号与中断的区别: (1)中断有优先级,而信号没有优先级,所有的信号都是平等的; (2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运 行; (3)中断响应是及时的,而信号响应通常都有较大的

4、时间延迟。 信号机制具有以下三方面的功能: (1)发送信号。发送信号的程序用系统调用 kill( )实现; (2)预置对信号的处理方式。接收信号的程序用 signal( )来实现对处理方 式的预置; (3)收受信号的进程按事先的规定完成对相应事件的处理。 2、信号的发送 信号的发送,是指由发送进程把信号送到指定进程的信号域的某一位上。 如果目标进程正在一个可被中断的优先级上睡眠,核心便将它唤醒,发送进程 就此结束。一个进程可能在其信号域中有多个位被置位,代表有多种类型的信 号到达,但对于一类信号,进程却只能记住其中的某一个。 进程用 kill( )向一个进程或一组进程发送一个信号。 3、对信号

5、的处理 当一个进程要进入或退出一个低优先级睡眠状态时,或一个进程即将从核 心态返回用户态时,核心都要检查该进程是否已收到软中断。当进程处于核心 态时,即使收到软中断也不予理睬;只有当它返回到用户态后,才处理软中断 信号。对软中断信号的处理分三种情况进行: (1)如果进程收到的软中断是一个已决定要忽略的信号(function=1) ,进 程不做任何处理便立即返回; (2)进程收到软中断后便退出(function=0) ; (3)执行用户设置的软中断处理程序。 二、所涉及的中断调用 1、kill( ) 系统调用格式 int kill(pid,sig) 参数定义 int pid,sig; 其中,pi

6、d 是一个或一组进程的标识符,参数 sig 是要发送的软中断信号。 (1)pid0 时,核心将信号发送给进程 pid。 (2)pid=0 时,核心将信号发送给与发送进程同组的所有进程。 (3)pid=-1 时,核心将信号发送给所有用户标识符真正等于发送进程的有 效用户标识号的进程。 2、signal( ) 预置对信号的处理方式,允许调用进程控制软中断信号。 系统调用格式 signal(sig,function) 头文件为#include 参数定义 signal(sig,function)int sig; void (*func) ( ) 其中 sig 用于指定信号的类型,sig 为 0 则表示

7、没有收到任何信号,余者如 下表:值名 字说 明 01SIGHUP挂起(hangup) 02SIGINT中断,当用户从键盘按c 键或break 键时 03SIGQUIT退出,当用户从键盘按 quit 键时 04SIGILL非法指令 05SIGTRAP跟踪陷阱(trace trap) ,启动进程,跟踪代码的执行 06SIGIOTIOT 指令 07SIGEMTEMT 指令 08SIGFPE浮点运算溢出 09SIGKILL杀死、终止进程 10SIGBUS总线错误 11SIGSEGV段违例(segmentation violation) ,进程试图去访问其虚地址空 间以外的位置 12SIGSYS系统调用

8、中参数错,如系统调用号非法 13SIGPIPE向某个非读管道中写入数据 14SIGALRM闹钟。当某进程希望在某时间后接收信号时发此信号 15SIGTERM软件终止(software termination) 16SIGUSR1用户自定义信号 1 17SIGUSR2用户自定义信号 2 18SIGCLD某个子进程死 19SIGPWR电源故障function:在该进程中的一个函数地址,在核心返回用户态时,它以软中断 信号的序号作为参数调用该函数,对除了信号 SIGKILL,SIGTRAP 和 SIGPWR 以外的信号,核心自动地重新设置软中断信号处理程序的值为 SIG_DFL,一个 进程不能捕获

9、SIGKILL 信号。 function 的解释如下: (1)function=1 时,进程对 sig 类信号不予理睬,亦即屏蔽了该类信号; (2)function=0 时,缺省值,进程在收到 sig 信号后应终止自己; (3)function 为非 0,非 1 类整数时,function 的值即作为信号处理程序的 指针。 二、共享存储区二、共享存储区 1、共享存储区机制的概念 共享存储区(Share Memory)是 UNIX 系统中通信速度最高的一种通信 机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射) 在多个进程的虚地址空间中。另一方面,一个进程的虚地址空间中又可连

10、接多 个共享存储区,每个共享存储区都有自己的名字。当进程间欲利用共享存储区 进行通信时,必须先在主存中建立一共享存储区,然后将它附接到自己的虚地 址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其它部分的操作完全相同。进程之间便可通过对共享存储区中数据的读、写来进行直接通信。 图示列出二个进程通过共享一个共享存储区来进行通信的例子。其中,进程 A 将建立的共享存储区附接到自己的 AA区域,进程 B 将它附接到自己的 BB区 域。进程 A 的虚空间 内存空间 进程 B 的虚空间AA应当指出,共享存储区机制只为进程提供了用于实现通信的共享存储区和 对共享存储区进行操作的手段,然而并未提供对

11、该区进行互斥访问及进程同步 的措施。因而当用户需要使用该机制时,必须自己设置同步和互斥措施才能保 证实现正确的通信。 二、涉及的系统调用 1、shmget( ) 创建、获得一个共享存储区。 系统调用格式:shmid=shmget(key,size,flag) 该函数使用头文件如下: #include #include #include 参数定义int shmget(key,size,flag);key_t key;int size,flag; 其中,key 是共享存储区的名字;size 是其大小(以字节计) ;flag 是用户 设置的标志,如 IPC_CREAT。IPC_CREAT 表示若系统

12、中尚无指名的共享存储 区,则由核心建立一个共享存储区;若系统中已有共享存储区,便忽略 IPC_CREAT。 附:操作允许权 八进制数用户可读 00400用户可写 00200小组可读 00040小组可写 00020 其它可读 00004其它可写 00002正文数据栈共享 存储区正文数据 BB 栈控制命令 值 IPC_CREAT 0001000 IPC_EXCL 0002000 例:shmid=shmget(key,size,(IPC_CREAT|0400)创建一个关键字为 key,长度为 size 的共享存储区 2、shmat( )共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空

13、 间上。 系统调用格式:virtaddr=shmat(shmid,addr,flag) 该函数使用头文件如下: #include #include #include 参数定义char *shmat(shmid,addr,flag);int shmid,flag;char * addr; 其中,shmid 是共享存储区的标识符;addr 是用户给定的,将共享存储区 附接到进程的虚地址空间;flag 规定共享存储区的读、写权限,以及系统是否 应对用户规定的地址做舍入操作。其值为 SHM_RDONLY 时,表示只能读;其 值为 0 时,表示可读、可写;其值为 SHM_RND(取整)时,表示操作系统在

14、 必要时舍去这个地址。该系统调用的返回值是共享存储区所附接到的进程虚地 址 viraddr。 3、shmdt( ) 把一个共享存储区从指定进程的虚地址空间断开。 系统调用格式:shmdt(addr) 该函数使用头文件如下: #include #include #include 参数定义int shmdt(addr);char addr; 其中,addr 是要断开连接的虚地址,亦即以前由连接的系统调用 shmat( )所 返回的虚地址。调用成功时,返回 0 值,调用不成功,返回-1。 4、shmctl( ) 共享存储区的控制,对其状态信息进行读取和修改。 系统调用格式:shmctl(shmid,

15、cmd,buf) 该函数使用头文件如下: #include #include #include 参数定义int shmctl(shmid,cmd,buf);int shmid,cmd;struct shmid_ds *buf; 其中,buf 是用户缓冲区地址,cmd 是操作命令。命令可分为多种类型: (1)用于查询有关共享存储区的情况。如其长度、当前连接的进程数、共 享区的创建者标识符等; (2)用于设置或改变共享存储区的属性。如共享存储区的许可权、当前连 接的进程计数等; (3)对共享存储区的加锁和解锁命令; (4)删除共享存储区标识符等。 上述的查询是将 shmid 所指示的数据结构中的有关成员,放入所指示的缓 冲区中;而设置是用由 buf 所指示的缓冲区内容来设置由 shmid 所指示的数据 结构中的相应成员。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号