操作系统实验一:父子进程通信
操作系统实验一:进程的建立
一、 实验目的:
创建进程及子进程;
在父子进程之间实现进程通信;
二、 实验内容:
创建进程并显示标识等进程控制块的属性信息;
显示进程的通信信息和相应的应答信息;
三、实验要求
显示创建的进程及控制块参数;
显示进程之间的关系参数;
实现父子进程之间通信模拟;
四、实验设计与实现:
设计思路:实验要求在 父子进程 之间实现进程通信,所以可以采用 fork() 函数来通过一个进程创建他的一个子进程。关于父子进程之间通信可以采用 无名管道 这一方式。无名管道是通过内核开辟一段缓存空间,进程共享这段缓存空间,通过文件描述符( write()和read() )对这段缓存空间的读写来实现进程之间的通信。一个无名管道在进程双向通信时有极大可能产生 干扰 (即父进程刚写入的信息在子进程读到之前就又被父进程读到),为了防止干扰,采用了两个 无名管道 实现 父子进程间双向通信。此外,通过 getpid()和getppid() 获取父子进程的pid标识符。
实验环境:Linux系统,Ubuntu 64位 20.04.2.0;
实验代码:
Pipe.c:
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<string.h> // for bzero()/* *该函数用来输出错误信息;*/ void print_err(char *estr) {perror(estr);exit(-1); }int main(void) {int ret = 0; // ret变量用来接收返回值;/** 用两个数组来存放两个管道的文件描述符;* [0]元素:存放读文件描述符;* [1]元素:存放写文件描述符; */int pipefd1[2] = {0}; int pipefd2[2] = {0};ret = pipe(pipefd1); // 调用pipe函数判断返回值;if(ret == -1){print_err("pipe1 fail");}ret = pipe(pipefd2); if(ret == -1){print_err("pipe2 fail");}ret = fork(); // 创建父子进程并判断返回值;if(ret == -1){print_err("fork fail");}if(ret > 0){/* * 该段代码是父进程执行的;*/close(pipefd1[0]); // 关闭父进程管道一的读描述符(防止干扰);close(pipefd2[1]); // 关闭父进程管道二的写描述符;char buf[30] = {0}; // 定义一个缓存字符串组;int f_pid;f_pid = getpid();int s_pid;s_pid = ret;while(1){printf("\033[35;1m输入父进程(pid=%d)发送的消息:", f_pid);scanf("%s", buf);write(pipefd1[1], buf, sizeof(buf)); // 写入管道1;sleep(1);bzero(buf, sizeof(buf)); // 清空缓存区;read(pipefd2[0], buf, sizeof(buf)); // 读管道2;printf("\033[35;1m父进程(pid=%d)接收子进程(pid=%d)的消息: %s\n", f_pid, s_pid, buf);}}else if(ret == 0){/* * 该段代码是子进程执行的;*/close(pipefd1[1]); //关闭子进程的写描述符;close(pipefd2[0]);char buf[30] = {0}; // 定义一个缓存字符串组;int s_pid;s_pid = getpid();int f_pid;f_pid = getppid();while(1){bzero(buf, sizeof(buf)); // 清空缓存区;read(pipefd1[0], buf, sizeof(buf));printf("\033[36;1m子进程(pid=%d)接收父进程的消息(pid=%d):%s\n", s_pid, f_pid, buf); sleep(1); printf("\033[36;1m输入子进程(pid=%d)发送的数据:", s_pid);scanf("%s", buf);write(pipefd2[1], buf, sizeof(buf)); }}return 0; }
五、实验结果分析:
在Linux终端中输入:
gcc pipe.c ./a.out
终端输出结果:
- 在提示下输入字符串,实现了父子进程之间的通信。
参考视频:
https://www.bilibili.com/video/BV1fE411v7Bb?p=6
https://edu.51cto.com/course/13462.html
操作系统实验一:父子进程通信相关推荐
- 操作系统实验三、进程通信
文章目录 操作系统实验三.进程通信 一.实验目的 二.实验内容 三.设计原理(或方案)及相关算法 四.结果分析 五.源代码 操作系统实验三.进程通信 一.实验目的 1.了解和熟悉Linux支持的消 ...
- 【操作系统实验】Linux进程通信—共享内存通信、管道通信
Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...
- Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc
操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...
- 广州大学2020操作系统实验一:进程管理与进程通信
相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...
- 操作系统实验一:进程管理
操作系统实验一:进程管理 一.实验目的: 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建.执行.撤销). 二.实验要求及内容: 用C ...
- 进程通信实例之父子进程通信
参考 /* 父子进程通信范例 */ #include <stdio.h> #include <unistd.h> #include <string.h> #incl ...
- Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信
一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...
- exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)
(1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...
- 操作系统实验3:进程运行轨迹的跟踪与统计
参考 哈工大操作系统实验 B站UP主的视频讲解 Linux内核完全注释:基于0.11内核(修正版V3.0) https://www.cnblogs.com/wanghuizhao/p/16644919 ...
- linux系统进程调度算法实验,操作系统实验三、进程调度算法实验
实验三.进程调度算法实验 3.1 实验目的 加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程 调度策略的使用方法.练习进程调度算法的编程和调试技术. 3.2 实验说明 在 ...
最新文章
- PTA基础编程题目集-6-1 简单输出整数
- Android 设置EditText光标Cursor颜色及粗细
- configparser模块
- 传统jdbc存在的问题总结
- python【数据结构与算法】各进制转换-使用内置函数
- Python 库兼容性问题-fromstring() has been removed. Please call frombytes() instead.原因及解决办法
- android 控件监听方法,Android界面控件(2)—注册点击事件监听器
- 凭证 90000000 保存(帐户确定出错)
- 在SQL Server里如何进行页级别的恢复
- 九度oj题目1385:重建二叉树
- 打不死的redis集群
- Eclipse利用Maven2搭建SpringMVC框架的Web工程
- JDK 8的Calendar.Builder
- python pandas serie简介及基本使用
- android capitalize,How to capitalize every letter in an Android EditText?
- potato什么软件_曝光:诈骗数十亿的“张鹏”再出新项目美生在线,诈骗犯都这么努力,你还有什么资格不努力!?...
- 解决springboot jar包冲突
- c语言延时程序 ms us,C语言延时程序(ms,us)
- 谷歌浏览器开启深色模式
- tensorflow获取中间变量参数值