Linux进程间通信
- 格式:ppt
- 大小:4.02 MB
- 文档页数:17


Linux进程问管道通信的研究 2008正
文章编号:1003—5850(2008,01—0048—03 Linux进程间管道通信的研究
The Research on Inter—Process Pipe Communication under Linux
周 超董军军 (焦作大学计算机系 焦作454003) 【摘 要】对于多用户、多任务的操作系统,进程间的通信(Inter—Process Communication,IPC)是非常重要的, 它是使整个系统得以有条不紊运作的基础。Linux操作系统提供了多种IPC机制,如信号、管道、信号量、消息
队列、共享内存和套接字等,其中以管道通信最能体现Linux平台的特色。为此,系统地分析了Linux平台下 的管道通信的实现机制,详细探讨了无名管道和命名管道的工作方式,并给出了相应的创建和使用的方法。 【关键词1 Linux,进程,管道,文件 中图分类号: FP301 文献标识码:A ABSTRACT Fhe Inter—Process Communication(IPC)is very important to the operating system of muhiuser and muhitask.It is the base of well working system.I.inux provides IPC mechanism including siganals,pipe,semaphore,shared—memory and socket eic.Inter—process pipe communicalion is feature of Linux.So this paper analyzes the mechanism of pipe communication under Linux platform systematically,discusses the work mode of anonymous pipe and named pipe in detail,and gives the corresponding method for creating and using them. KEYWORDS Linux,process,pipe,file
深 圳 大 学 实 验 报 告
课程名称: Linux系统编程
实验项目名称: 进程间通信
学院: 计算机与软件学院
专业:
指导教师: 冯 禹 洪
报告人: 学号 班级:
实验时间:
实验报告提交时间:
教务处制深圳大学学生实验报告用纸
一、 实验目标:
1. 掌握管道/命名管道的作用及其在编程中的作用
2. 掌握信号的作用及其在编程中的应用
3. 掌握客户端-服务器架构及其编程实现
4. 感受C库函数的实现与系统调用之间的关系
二、实验环境与工件
1. 湖边Linux实验室
2. Fedora 13
三、实验内容与步骤
客户端-服务器架构是常用的网络编程架构。使用我们现学的知识一个简单的客户端服务器可以描绘如图1。
图1. 客户端-服务器用FIFO进行通信
其中,服务器(Server)端的功能描述如下:
后台进程
从命名管道中读取客户端的请求
计算结果并将其写到客户端的命名管道
客户端(Client)的功能描述如下:
通过服务器命名管道发送请求到服务器
通过自己的命名管道读取服务器消息然后退出
用到的通信机制FIFO和信号处理。图2是客户端发送给服务器的请求的消息格式,图3是客户端的实现代码,图4是服务器端的实现代码。 深圳大学学生实验报告用纸
1
共享内存+互斥量实现linux进程间通信
一、 共享内存简介
共享内存是进程间通信中高效方便的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享内存进行读写。
共享内存并未提供进程同步机制,使用共享内存完成进程间通信时,需要借助互斥量或者信号量来完成进程的同步。这里说一下互斥量与信号量的区别。互斥量用于线程的互斥,信号量用于线程的同步,这是互斥量与信号量的本质区别,其次信号量实现互斥量的功能。
本文结合个人实际项目需求,采用互斥量实现进程间访问共享内存的互斥,即同一时刻只能允许一个进程对共享内存进行写操作。
二、 使用系统调用完成共享内存的申请、连接、分离和删除
共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成。使用时需要包含#include
、#include 、#include 和。
1.共享内存的申请
使用shmget()完成共享内存的申请,函数原型如下:
int shmget(key_t key,
size_t size, int shmflg);
key:共享内存的标识符,大于0的32位整数。若是父子关系的进程间通信,这个标识符用IPC_PRIVATE,若进程没有关系,可自行定义。
size:共享内存大小,单位Byte。
shmflg:共享内存的模式(mode),包括三部分,第一部分是:无指定标示符的共享内存是否创建,由
0(只获取)或IPC_CREAT(未创建则新建)决定。第二部分:IPC_EXCL(若已创建,则报错)。第三部分:权限标识,由八进制表示,如0640,第一个0是八进制数标识,第一个6(4+2)表示拥有者的权限读和写,第二个4表示同组权限写,第3个0表示他人的权限。这三部分由算数或运算符|拼接组成shmflg,如IPC_CREAT|0640。
详解linux进程间通信-消息队列前⾔:前⾯讨论了信号、管道的进程间通信⽅式,接下来将讨论消息队列。
⼀、系统V IPC
三种系统V IPC:消息队列、信号量以及共享内存(共享存储器)之间有很多相似之处。
每个内核中的 I P C结构(消息队列、信号量或共享存储段)都⽤⼀个⾮负整数的标识符
( i d e n t i f i e r )加以引⽤。
⽆论何时创建I P C结构(调⽤m s g g e t、 s e m g e t或s h m g e t) ,都应指定⼀个关键字(k e y),关
键字的数据类型由系统规定为 k e y _ t,通常在头⽂件< s y s / t y p e s . h >中被规定为长整型。关键字由
内核变换成标识符。
以上简单介绍了IPC,对接下来介绍的消息队列、信号量和共享内存有助于理解。
⼆、消息队列
1、简介
消息队列是消息的链接表 ,存放在内核中并由消息队列标识符标识。我们将称消息队列为
“队列”,其标识符为“队列 I D”。 m s g g e t⽤于创建⼀个新队列或打开⼀个现存的队列。 m s g s n d
⽤于将新消息添加到队列尾端。每个消息包含⼀个正长整型类型字段,⼀个⾮负长度以及实际
数据字节(对应于长度),所有这些都在将消息添加到队列时,传送给 m s g s n d。 m s g r c v⽤于从
队列中取消息。我们并不⼀定要以先进先出次序取消息,也可以按消息的类型字段取消息。
2、函数介绍
ftok函数
#include
#include
key_t ftok(const char *pathname, int proj_id);//“/home/linux” , 'a'
功能:⽣成⼀个key(键值)
msgget函数
#include
#include
#include
int msgget(key_t key, int msgflg);
功能:创建或取得⼀个消息队列对象