Linux 进程间通信 利用管道进行通讯. 2 主要内容 传统进程通信 信号通信 管道通信 System V IPC 进程通信 消息队列 共享主存 信号量 Socket 网络进程通信.

Slides:



Advertisements
Similar presentations
第九课 高级文件 IO 编程. 本章的主要内容 高级文件 IO 概述 Select 模型 Poll 模型 实验.
Advertisements

Linux 下进程间通信 管道 信号 信号量 共享内存 消息队列 套接字. 无名管道 管道是基于文件描述符的通信方式,当一个管 道建立时,它会创建两个文件描述符 fds[0] 和 fds[1] ,其中 fds[0] 固定用于读管道,而 fd[1] 固 定用于写管道,这样就构成了一个半双工的通 道。
Linux 环境及 Shell 程序 操作系统实验 1. 二、 Shell 编程与进程通信 常用 shell 命令 文件及文件属性操作 ls 、 cp 、 mv 、 rm ln 、 ln –s 、 chmod 、 groupadd 、 useradd 输入输出操作 echo 、 cat >> 、
Linux 系统. 操作系统发展需求 1 没有操作系统 2 简单批处理操作系统 3 多道程序设计的批处理 4 多道程序设计的分时操作系统 5 多处理机并行系统 6 网络操作系统 7 分布式操作系统.
FD班座谈会 -结合学校目标 找准自己位置-
第1单元 操作系统概论 第一节 绪论 操作系统定义.
行程(process).
马志强 软件学院501室 网络应用开发 马志强 软件学院501室
法國大革命                                                                            
補充: Input from a text file
第 5 章 文件I/O操作.
C程序设计 第10章 文 件 主讲教师: 鲁 萍 西安建筑科技大学 理学院.
複習 struct score_Type{ int chinese,english; }; struct my_Type{
C File System.
chapter 1-Introduction
计算概论 第二十一讲 文件操作 北京大学信息学院.
第七章. 文件系统 (lab5).
第7章 Linux环境编程.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
程式撰寫流程.
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
第十二章 文件 12.1 C文件概述 文件:存储在外部介质上数据的集合,是操作系统数据管理的单位 文件分类 按文件的逻辑结构: 按存储介质:
进程操作.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
文件读写实践 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
程式設計 博碩文化出版發行.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
第2章 套接字网络编程基础 2.1 UNIX套接字网络编程接口的 产生与发展 2.2 套接字编程的基本概念 2.3 面向连接的套接字编程
THE C PROGRAMMING LANGUAGE
如何生成设备节点 广州创龙电子科技有限公司
Linux 文件操作——系统调用和标准 IO 库
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
实验一、进程控制 一、实验目的 1、加深对进程的理解,进一步认识并发执行的实质; 2、分析进程争用资源现象,学习解决进程互斥的方法;
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
大綱 *專題演講介紹 *大陸醫療的改革與發展 *海報發表文章分享 2012海峽兩岸醫院院長論壇行後報告 ‧台北
一、文件的基本概念 第十三章 文 件 所谓“文件”是指一组相关数据的有序集合。 这个数据集有一
第7章 输入/输出流 文件和I/O流概述 标准I/O流的对象及其成员函数 文件流.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
作業系統 第三章 作業系統結構.
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
面向非连接的 SOCKET编程 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C標準輸出入函數庫 與 作業系統.
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
信号量(Semaphore).
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
本节内容 文件系统 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Visual Basic程序设计 第13章 访问数据库
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 7 章 进程间的通信.
挑戰C++程式語言 ──第9章 函數.
第13章 文 件.
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
实验二:添加Linux系统调用及熟悉常见系统调用
結構、檔案處理(Structure, File)
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab4.
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第6章 嵌入式软件开发基础.
第四章 UNIX文件系统.
104 四技二專甄選入學 簡章解析 輔導室 何乙娟.
第六章 直接成本法.
《操作系统设计与实现》 第5章 文件系统.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

Linux 进程间通信 利用管道进行通讯

2 主要内容 传统进程通信 信号通信 管道通信 System V IPC 进程通信 消息队列 共享主存 信号量 Socket 网络进程通信

管道分为无名管道和有名管道 举例 ls –l|more ps –ef|grep ntp

无名管道  它只能用于具有亲缘关系的进程之间的通信(也就是父子 进程或者兄弟进程之间)。  它是一个半双工的通信模式,具有固定的读端和写端。  管道也可以看成是一种特殊的文件,对于它的读写也可以使 用普通的 read() 和 write() 等函数。但是它不是普通的文件,并 不属于其他任何文件系统,并且只存在于内核的内存空间中 。

管道的创建 和关闭 创建管道可以通过调用 pipe() 来实现。 管道是基于文件描述符的通信方式,当一个管道建立时,它 会创建两个文件描述符 fd[0] 和 fd[1] ,其中 fd[0] 约定用于读管 道,而 fd[1] 约定用于写管道,这样就构成了一个半双工的通 道。 管道关闭时只需使用普通的 close() 函数逐个关闭各个文件描 述符。

父子进程之间的管道通信举例 父子进程分别拥有自己的读写通道,为了实现父 子进程之间的读写,只需把无关的读端或写端的 文件描述符关闭即可。此时,父子进程之间就建 立起了一条 “ 子进程写入父进程读取 ” 的通道。

#include #define MAX_DATA_LEN256 #define DELAY_TIME1

int main() {pid_t pid; int pipe_fd[2]; char buf[MAX_DATA_LEN]; const char data[] = "Pipe Test Program"; int real_read, real_write; memset((void*)buf, 0, sizeof(buf)); /* 创建管道 */ if (pipe(pipe_fd) < 0) { printf("pipe create error\n"); exit(1); }

if ((pid = fork()) > 0) {close(pipe_fd[1]); sleep(DELAY_TIME * 3); if ((real_read = read(pipe_fd[0], buf, MAX_DATA_LEN)) > 0) {printf("%d bytes read from the pipe is '%s'\n", real_read, buf);} close(pipe_fd[0]); waitpid(pid, NULL, 0); exit(0);} else if (pid == 0) {close(pipe_fd[0]); sleep(DELAY_TIME); if((real_write = write(pipe_fd[1], data, strlen((const char*)data))) != -1) {printf("Parent wrote %d bytes : '%s'\n", real_write, data);} close(pipe_fd[1]); exit(0);}} 关闭写口

有名管道

有名管道的名字为文件路径名,可以用命令创建, 和删除有名管道,它属于 Linux 的特别文件 mkfifo -m 0644 /temp/mypipo rm /temp/mypipo 和一般的文件又有不同:有名管道遵循先进先出 规则,先进入管道的数据被先读出,它们不支持 如 lseek() 等文件定位操作

有名管道创建

有名管道 ( 2 ) 在创建管道成功之后,就可以使用 open() 、 read() 和 write() 这些函数了。与普通文件的开发设置一 样 。 open() 中设置读写模式, O_RDONLY , O_WRONLY O_RDWR 非阻塞标志可以在 open() 函数中设定为 O_NONBLOCK 有关文件操作另外见 word 文档

有名管道 读写规则 对于读进程  若该管道是阻塞打开,且当前 FIFO 内没有数据,则对 读进程而言将一直阻塞到有数据写入。  若该管道是非阻塞打开,则不论 FIFO 内是否有数据, 读进程都会立即执行读操作。即如果 FIFO 内没有数据, 则读函数将立刻返回 0 。 对于写进程  若该管道是阻塞打开,则写操作将一直阻塞到数据可 以被写入。  若该管道是非阻塞打开而不能写入全部数据,则写操 作进行部分写入或者调用失败。

示例(读管道的程序) #include #define MYFIFO"/tmp/myfifo" /* 有名管道文件名 */ #define MAX_BUFFER_SIZEPIPE_BUF /* 定义在于 limits.h 中 */

示例(读管道的程序) int main() {char buff[MAX_BUFFER_SIZE]; int fd; int nread; /* 判断有名管道是否已存在,若尚未创建,则以相 应的权限创建 */ if (access(MYFIFO, F_OK) == -1) {if ((mkfifo(MYFIFO, 0666) < 0) && (errno != EEXIST)) {printf("Cannot create fifo file\n"); exit(1);}} 管道名字 权限

示例(读管道的程序) /* 以只读阻塞方式打开有名管道 */ fd = open(MYFIFO, O_RDONLY); if (fd == -1) {printf("Open fifo file error\n"); exit(1);} while (1){ memset(buff, 0, sizeof(buff)); if ((nread = read(fd, buff, MAX_BUFFER_SIZE)) > 0) {printf("Read '%s' from FIFO\n", buff);}} close(fd);exit(0);}

还需要一个写管道的程序 ……….

示例(写管道的程序) #include #define MYFIFO"/tmp/myfifo"/* 有名管道文 件名 */ #define MAX_BUFFER_SIZEPIPE_BUF /* 定义在 于 limits.h 中 */

int main(int argc, char * argv[]) /* 参数为即将写入 的字符串 */ {int fd; char buf f[MAX_BUFFER_SIZE]; int nwrite; if(argc <= 1) {printf("Usage:./fifo_write string\n"); exit(1);} sscanf(argv[1], "%s", buff); /* 以只写阻塞方式打开 FIFO 管道 */ fd = open(MYFIFO,O_WRONLY); if (fd == -1){printf("Open fifo file error\n");exit(1);} if ((nwrite = write(fd, buff, MAX_BUFFER_SIZE)) > 0) {printf("Write '%s' to FIFO\n", buff);} close(fd);exit(0);}