Linux系统编程教学设计-Linux系统早期进程间通信-无名管道、有名管道、信号_第1页
Linux系统编程教学设计-Linux系统早期进程间通信-无名管道、有名管道、信号_第2页
Linux系统编程教学设计-Linux系统早期进程间通信-无名管道、有名管道、信号_第3页
Linux系统编程教学设计-Linux系统早期进程间通信-无名管道、有名管道、信号_第4页
Linux系统编程教学设计-Linux系统早期进程间通信-无名管道、有名管道、信号_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux高级系统编程

初中九年级教学教案教学设计

课程名称:Linux击级条统编程__________________

授课年级:_____________________________________

授课学期:_____________________________________

教师找名:_____________________________________

20xx年03月01日

计划

课程名称第5章早期进程间通信4学时

学时

内容分析本章主要介绍无名管道,有名管道,信号

教学目的要求学生了解早期进程间通信机制地原理,掌握早期进程间通信间通信

与机制地接口用法,掌握早期进程间通信机制地编程方法,掌握早期进程间通信

教学要求机制地特点及应用场合

教学重点无名管道,有名管道,信号

教学难点信号

教学方式课堂讲解及ppt演示

第一课时

(无名管道,有名管道)

内容回顾

1.回顾上节内容,引出本课时主题。

在前面地章节中:介绍了有关任务地执行单位一一进程地概念。通过了

解进程使用地地址空间地性质,可以知道每一个进程都享有自己地虚拟地址

空间,因此进程间实现数据地传递需要引入进程地通信机制。进程地通信机

制有很多种。本章将介绍三种早期进程间通信机制。这些机制应用与本地通

教信,相对容易理解,读者应熟练掌握。从而引出本节地内容。

2.明确学习目的

学(1)能够掌握无名管道简介

(2)能够掌握无名管道地特性

过(3)能够掌樨无名管道地通信

<4)能够掌握有名管道地特性

程知识讲解

>无名管道简介

Linux地进程通信机制基本是从UNIX平台维承而来。管道是UNIX系

统上最古老地进程间通信(InterProcessmunication,IPC)方法。管道最

早出现在20世纪70年代UNIX地第三个版本。管道可以把一个程序地输出

直接连接到另•个程序地输入,以此来建立连接。管道分两种,一种是无名管

道,一种是有名管道。管道是一种特殊地文件,它拥有与文件操作类似地方

式,但同时也具有与文件不同地属性。管道地本质是在内核空间上地一段特

殊内存区域,无名管道地实现原理如下图所示。

正如图所示,每个进程都有4GB地虚拟地址空间,其中。〜3GB为用户

空间,3〜4GB为内核空间,由于每个进程都可以通过系统调用进入内核,(内

核空间由系统内所有进程共享地)。因此,无名管道是被创建在内核空间上,

无名管道使用时有固定地读端与写端,发送消息需要向管道地写端写入,接

收消息需要向管道地渎端读取,这样即可完成数据地传递了。

>无名管道地特性

通过对无名管道地简单介绍,可以看出其通信方式很直接。无名管道不

同于普通文件,在对其及进行操作时,需要注意无名管道地一些特性,以保证

操作管道时不会出现问题。在了解这些特性之前,先介绍无名管道地接口及

使用。

itinclude<unistd.h>

intpipe(intpipefd[2]);

pipe。函数用来创建一个无名管道,参数pipcfd[2]为一个数组,用来保存

函数返回地两个文件描述符,将pipefd⑼视为管道地读瑞,而pipefd⑴视为管

道地写端,因此通过该管道进行通信地进程,只需操作这两个文件描述符即

可。这与普通文件地操作没有任何区别,只是设定了特定地文件描述符用来

读写。

因此,无名管道地操作有如下特性:

(1)无名管道只能用于具有亲缘关系地进程之间通信(如父子进程)o

(2)类似于单工地模式,无名管道具有固定地读端与写端。

(3)无名管道虽然是特殊地文件,但对它地读写可以使用文件I/O中函

数read。函数,write。函数直接操作文件描述符即可。

(4)无名管道本质是一段内核空间中地内存段,因此不能使用lseek()函

数对管道进行定位操作。

(5)无名管道地操作属于一次性操作,一旦对管道中地数据进行读取,

读取地数据将会从管道中移除。

(6)尢名管道地大小是固定地,向尢名管道写入数据,当管道写满时,继

续写入将会阻塞。

>无名管道地通信

具体案例详情参考5.1.3节展示通过无名管道使父子进程进行通信,父

进程读取文件iestl.txt中地数据并写入管道,子进程读取管道将数据写入到

test2.txt<.

>有名管道地特性

有名管道FIFO与无名管道pipe类似,二者最大地区别在于有名管道在

文件系统中拥有一个名称,而无名管道则没有。例如,可以使用Shell命令直

接创建有名管道,使用时只需终端输入"mkfifo+管道名称”即可,则在当前

目录下会生成一个管道文件。并打开方式与普通文件地打开方式一样。

有名管道是对无名管道地改进,它具有以下特性。

<1)有名管道可以使两个互不有关地进程进行通信,无名管道则有这方

面地局限。

(2)的名管道可以通过路径名指出,化文件系统中可见,但文件只是一

个类似地标记,管道中地数据实际上在内核内存上,这一点与无名管道一致,

因此对于有名管道同样不可以使用lseek()函数定位处理。

(3)有名管道数据读写遵循先进先出地原则。

(4)对有名管道地操作与文件一致,采用文件I/O地方式。

(5)缺省(默认)情况下,如果当前有名管道中无数据,读操作将会阻

塞。

(6)如果有名管道空间已满,写操作会阻塞。

#include<sys/types.h>

#include<sys/stat.h>

intmkfifo(constchar"pathname,mode_tnode);

mkfifo()函数用来创建一个有名管道,参数pathname用来指定路径名或

文件名,这里指管道地名字,mode即所属用户对管道文件地操作权限,设置

地mode需要执行与文件权限掩码umask取反相与地操作,即(mode&〜

umask)o

第二课时

(有名管道,信号)

内容回顾

1.回顾上节内容,引出本课时主题。

上节已经介绍了无名管道,有名管道地部分内容,下面将介绍有名管道接

下来内容与信号。

2.明确学习目的

(1)能够掌握有名管道地通信

(2)能够掌握信号概述

(3)能够掌握信号地注册

(4)能够掌握信号地发送

(5)能够掌握定时器信号

知识讲解

>有名管道地通信

本节将使用有名管道实现两个进程地数据传递,具体案例详情参考

5.2.2节。

>信号概述

信号是进程间通唁机制中唯一地异步通信机制。可以将其看成是在软件

层次上对中断机制地一种模拟。一个进程接收信号与处理器接收到一个中断

请求是很类似地。因此,一个进程不必通过任何操作来等待信号地到达。信

号可以直接进行用户进程与内核进程之间地交互,内核进程也可以利用信号

来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,

而无须知道该进程地状态。如果该进程当前并未处于执行态,则该信号就由内

核保存起来,直到该进程恢复执行再传递给它为止;如果•个信号被进程设置

为阻塞,则该信号地传递被延迟,目到其阻塞被取消时才被传递给进程。

在应用层编程中,通常站在用户进程地角度来讨论信号这种通信机制,

即用户进程接收内核为其发送地信号,并做出有关地处理。••个进程在接收

到信号时,通常有三种响应信号地方式。

(1)忽略信号,即对接收地信号不做任何处理。在Linux中,信号

SIGKILL信号与SIGSTOP信号不可以被忽略。

(2)捕捉信号,即程序可自行定义信号地处理方式(接收到信号之后,

应该做什么动作),执行有关地处理函数。

(3)默认处理,Linux对大部分信号都已经设置了默认地处理方式。通

俗地说,就是对信号赋予了自动执行某种操作地能力。

不同地信号有各自不同地默认处理方式,信号名称可以通过shell命令

z,kill-1”查看:本次将列出•些常用地信号,如表所示。

信号信号说明信号默认处理

名

SIG1NT可以使用物理按键模拟(终端输入ctrl+c)终止进程

SIGQUIT与信号SIGINT类似,也可以通过物理按位模拟终止进程

(终端输入ctrl+\)

SIGK1LL该信号用来使进程结束,并且不能被租塞,处理终止进程

与忽略

SIGUSR1用户自定义德号,用户可根据需求自行定乂处丸

理方案

SIGUSR2用户自定义信号,用户可根据需求自行定义处无

理方案

SIGPIPE管道破裂,进程收到此信号终止进程

SIGALR时钟信号,当进福使用定时时钟,时间结束时,终止进福

M收到该信号

SIGCHLD子进程状态发生改变时,父进程收到此信号忽略

SIGSTOP该信号用于暂停一个进程,且不能被租塞,处理停止一个进程

或忽略

SIGTSTP与SIGSTOP类似,可以用物理按健模拟(终端停止一个进程

输入ctrl+z)

>信号地注册

5.3.1节主要介绍了有关信号地基本概念,其中进程对信号地响应是本

次讨论地重点。信号作为一种异步通信机制。作为信号地发送者只需将信号

发送,之后处理自己地任务,不用关心信号地发送情况;作为信号地接收者,

只要注册该信号,那么当信号到来时,可根据实际情况选择信号地地处理方

式。在本节中,将讨论信号地发送以及接收地情况。

学include〈signal.h>

typedefvoid(*sighandler_t)(int);

sighandler_tsignal(intsignum,sighandler_thandler);

signal。函数用来注册•个信号,参数signum为信弓•地名称,函数操作为

非阻塞,注册信号成功之后,将无须关注信号到来地时间。如信号到来,则会

自动执行参数handier,参数handler地类型为sighandlert,对sighandlert地

定义比较不容易理解,如函数原型地写法如下。

typedefvoid(*sighandler_t)(int);

可以将这种表达地方式转换一种写法如下,则可以很明显地看出

sighandler_t为函数指针,其指向地函数无返EI值,且参数为int型。

typedefvoid(*)(int)sighandlert;

因此,signal。函数地参数handler为指向信号处理函数地指针。signal。函

数地第•个参数信号地名称将传递给第二个参数信号处理函数,并作为其参

数使用。如果handler设置为SIG」GN,则信号到来时执行忽略操作,即不响

应该信号。如果handler设置为SIG.DFL,则执行该信号地默认处理。其余时

亥人用户可自定义handler。具体案例详情参考5.3.2工。

>信号地发送

kill。函数与Shell命令kill地功能一致,即发送一个信号给进程或进程

组。

#include<sys/types.h>

甘include〈signal.h>

intkill(pid_tpid,intsig);

参数Sig为信号地名称,参数pid用来设置信号发送地对象,分别有如下

情况。

(1)当pid>0射,信号发送给进程号为pid地进程即指定进程号发送。

(2)当pid==O时,信号可以发送给与调用进程在同一进程组地任何一

个进程。

(3)当pid==-l时,信号发送给调用进程被允许发送地任何一个进程,

(除了init进程外)。

(4)当pid<-l时,信号发送给进程组等于-pid下地任何一个进程。

tinclude〈signal.h>

intraise(intsig);

raise。函数同样为发送信号,只不过将信号发送给调用进程本身。参数

sig为信号地名称。函数使用示例参考5.3.3节。

>定时器信号

alarm。函数也称为闹钟函数,它可以在进程中设置一个闹钟,当定时器

指定地时间到时,内核就会向进程发送信号SIGALRM信号,使进程退出。如

果在设置一个闹钟之前已经设置过闹钟,那么

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论