操作系统实验一:进程的建立


一、 实验目的:

  1. 创建进程及子进程;

  2. 在父子进程之间实现进程通信;

二、 实验内容:

  1. 创建进程并显示标识等进程控制块的属性信息;

  2. 显示进程的通信信息和相应的应答信息;

三、实验要求

  1. 显示创建的进程及控制块参数;

  2. 显示进程之间的关系参数;

  3. 实现父子进程之间通信模拟;

四、实验设计与实现:

  • 设计思路:实验要求在 父子进程 之间实现进程通信,所以可以采用 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. 操作系统实验三、进程通信

    文章目录 操作系统实验三.进程通信 一.实验目的 二.实验内容 三.设计原理(或方案)及相关算法 四.结果分析 五.源代码 操作系统实验三.进程通信 一.实验目的 ​ 1.了解和熟悉Linux支持的消 ...

  2. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

  3. Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc

    操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...

  4. 广州大学2020操作系统实验一:进程管理与进程通信

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  5. 操作系统实验一:进程管理

    操作系统实验一:进程管理 一.实验目的: 通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建.执行.撤销). 二.实验要求及内容: 用C ...

  6. 进程通信实例之父子进程通信

    参考 /* 父子进程通信范例 */ #include <stdio.h> #include <unistd.h> #include <string.h> #incl ...

  7. Linux——(管道练习)C实现父子进程通信、兄弟进程通信、多个读写端操作管道及管道缓冲区大小、fifo实现非血缘间进程通信

    一. 父子进程通信 lswc-l 父进程ls写到管道,子进程wc管道的内容 父进程创建管道(拥有读写两端),父进程fork子进程,父进程要将原本输出到屏幕上的内容输出到管道中,用dup实现,然后exe ...

  8. exec函数介绍(整理)(附带:操作系统实验一:进程控制实验 代码)

    (1)exec函数说明 fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法.它可以根据指定的 ...

  9. 操作系统实验3:进程运行轨迹的跟踪与统计

    参考 哈工大操作系统实验 B站UP主的视频讲解 Linux内核完全注释:基于0.11内核(修正版V3.0) https://www.cnblogs.com/wanghuizhao/p/16644919 ...

  10. linux系统进程调度算法实验,操作系统实验三、进程调度算法实验

    实验三.进程调度算法实验 3.1 实验目的 加深对进程调度概念的理解,体验进程调度机制的功能,了解Linux 系统中进程 调度策略的使用方法.练习进程调度算法的编程和调试技术. 3.2 实验说明 在 ...

最新文章

  1. PTA基础编程题目集-6-1 简单输出整数
  2. Android 设置EditText光标Cursor颜色及粗细
  3. configparser模块
  4. 传统jdbc存在的问题总结
  5. python【数据结构与算法】各进制转换-使用内置函数
  6. Python 库兼容性问题-fromstring() has been removed. Please call frombytes() instead.原因及解决办法
  7. android 控件监听方法,Android界面控件(2)—注册点击事件监听器
  8. 凭证 90000000 保存(帐户确定出错)
  9. 在SQL Server里如何进行页级别的恢复
  10. 九度oj题目1385:重建二叉树
  11. 打不死的redis集群
  12. Eclipse利用Maven2搭建SpringMVC框架的Web工程
  13. JDK 8的Calendar.Builder
  14. python pandas serie简介及基本使用
  15. android capitalize,How to capitalize every letter in an Android EditText?
  16. potato什么软件_曝光:诈骗数十亿的“张鹏”再出新项目美生在线,诈骗犯都这么努力,你还有什么资格不努力!?...
  17. 解决springboot jar包冲突
  18. c语言延时程序 ms us,C语言延时程序(ms,us)
  19. 谷歌浏览器开启深色模式
  20. tensorflow获取中间变量参数值

热门文章

  1. 黑苹果声音低、有杂音、爆音解决方案
  2. 关于HTML页面跳转的5种方法分享。
  3. RIP、OSPF、ISIS协议的区别
  4. IC卡(智能卡)APDU通讯总结
  5. 无人机水平方向四环串级控制,竖直方向三环串级控制(2020.6.30备份)
  6. Django 开发收银系统六
  7. 移动端车牌识别SDK应用
  8. 北京限行轮换时间7月5日起,北京新一轮尾号限行规定用便签提醒
  9. origin 页边距紧凑设置
  10. 数据质量六大评价标准