操作系统实验——进程创建与进程间通信

简介: 操作系统实验——进程创建与进程间通信

操作系统实验——进程创建与进程间通信

文章目录

实验报告在和代码在文章底部


实验目的

  1. 理解PCB以及系统调用的概念。
  2. 理解进程创建以及进程并发执行的过程。
  3. 掌握fork系统调用和exec系统调用的用法。
  4. 掌握使用fork创建多个子进程以及进程树的方法。
  5. 了解进程间通信的常用方法。

实验内容

一、创建进程树

编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程标识getpid()和父进程标识getppid()。

实验分析:

创建流程是先由a创建b进程,b进程创建c进程,c进程创建d进程

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
int main()
{
  pid_t pida,pidb,pidc,pidd;
  while((pidb=fork())==-1);
  if(pidb>0) 
    {
      wait(0); 
        printf("Apid=%d,ppid=%d\n",getpid(),getppid());
    }
  else  //p
   {
     while((pidc=fork())==-1);
     if(pidc>0)   
        { 
         wait(0); 
         printf("Bpid=%d,pidd=%d\n",getpid(),getppid());
    }
     else //p
       {
    while((pidd=fork())==-1);
        if(pidd >0)   //p2
          {
            wait(0); 
        printf("Cpid=%d,pidd=%d\n",getpid(),getppid());
      }
        else //p
          { 
        printf("Dpid=%d,pidd=%d\n",getpid(),getppid());
      }   
      }   
    }
}

运行结果:


同样的思路,图二中的创建流程为:

由父进程a同时建立b,c子进程,再由b进程创建d子进程,c子进程再创建e、f子进程

运行结果如下:

二、vfork以及execl的使用

实验要求一:

统计创建的子进程的数量,并在主进程中正确显示

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
int main(){
  signal(SIGCHLD,SIG_IGN);
  int num = 0; 
  pid_t pid1,pid2,pid3,pid4,pid5;
  while((pid1 = vfork()) == -1);
  if(pid1 == 0)
  {
    while((pid2=vfork())==-1);
    if(pid2 == 0)
    {
      wait(0);
      num++;
      printf("Dpid is %d , Dppid is %d\n",getpid(),getppid());
      _exit(0);
    }
    else
    {
      wait(0);
      num++;
      printf("Bpid is %d , Bppid is %d\n",getpid(),getppid());
      _exit(0);
    }
  }
  else
  {
    while((pid3=vfork())==-1);
    if(pid3 == 0)
    {
      while((pid4=vfork())==-1);
      if(pid4 == 0)
      {
        wait(0);
        num++;
        printf("Fpid is %d , Fppid is %d\n",getpid(),getppid());
        _exit(0); 
      }
      else
      {
        while((pid5=vfork())==-1);
        if(pid5 == 0)
        {
          wait(0);
          num++;
          printf("Epid is %d , Eppid is %d\n",getpid(),getppid());
          _exit(0);
        }
        else
        {
          wait(0);
          num++;
          printf("Cpid is %d , Cppid is %d\n",getpid(),getppid());
          _exit(0);
        } 
      }     
    }
    else
    {
      wait(0);
      printf("Apid is %d , Appid is %d\n",getpid(),getppid());
      printf("childnum is %d\n",num);     
    }
  }
}

实验结果:


实验要求二:

创建一个子进程,并在后台运行上述任意一个可执行文件,观察程序的运行结果。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include<sys/wait.h>
#include<sys/types.h>
#include<string.h>
int main(){
  pid_t pid1;
  while((pid1=fork())==-1);
  if(pid1==0)
  {
    wait(0);
    printf("This is child\n");
  }
  else
  {
    printf("This is father\n");
    execlp("./test3","5a",NULL);
  }
}

实验结果:

三、创建进程以及进程间通信(管道)的综合运用


实验要求:

主进程输入一个字符串,然后创建两个子进程:一个是发送进程,通过管道向另一个子进程发送一个字符串;另一个是接收进程,该子进程接收字符串后,启动一个后台加密程序对字符串进行加密并输出密文。


提示:需要使用系统调用fork(), execl(),pipe(),wait()/waitpid()


加密代码:

//encrypt.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char * argv[])
{
   int i=0;
   int len;
   if(argc<=1) {printf("%d\n",argc);return 0;}
   char * s =argv[1];
   printf("启动后台加密进程,进程号:%d\n",getpid());
   len = strlen(s);//取长度
   for(i=0;i<len;i++){
         if((s[i]>64 && s[i]<91) || (s[i]>96 && s[i]<123)){ //字符串加密
             if(s[i]=='z') s[i]='A';
             else if(s[i]=='Z') s[i]='a';
             else s[i] = s[i] + 1;             
         }
         else s[i] = s[i];
    }
    printf("加密后:%s\n",s);   
    return 1;  
}


具体代码:

见底部文件


实验结果:


实验代码和报告

文件下载地址

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
16天前
|
算法 调度 Python
深入理解操作系统:进程调度的奥秘
【8月更文挑战第4天】操作系统是计算机系统的核心,其中进程调度是其重要的组成部分。本文将深入探讨进程调度的原理和实现,包括进程调度的目标、常用的调度算法以及如何在实际中应用这些知识。我们将通过代码示例来展示进程调度的具体实现,帮助读者更好地理解和掌握这一关键技术。
|
25天前
|
存储 算法 调度
深入理解操作系统:从进程管理到内存分配
本文将探讨操作系统的核心概念,包括进程管理、内存分配以及文件系统等。我们将通过具体的案例和数据来分析这些概念的工作原理,以及它们如何影响计算机的性能和稳定性。文章将提供对操作系统内部机制的深入理解,帮助读者更好地理解和使用计算机。
37 0
|
24天前
|
存储 算法 定位技术
深入理解操作系统:从进程管理到内存分配
【7月更文挑战第27天】本文旨在为读者提供一个全面而深入的视角,以理解操作系统的核心概念和机制。我们将通过探讨进程管理、内存分配等关键主题,揭示这些复杂系统如何协同工作以确保计算环境的稳定和高效。文章将采用比喻和实例来阐释抽象的概念,使技术内容更加贴近生活,易于理解。
|
6天前
|
算法 调度 UED
操作系统的心脏:内核与进程管理
在数字世界的宏伟建筑中,操作系统是那支撑起一切软件运行的基石。本文将深入浅出地探讨操作系统的核心—内核,以及它如何通过进程管理来协调计算机资源的使用。我们将从内核的定义和功能出发,逐步深入到进程的生命周期,以及调度算法的重要性,最终揭示这些机制如何影响我们日常使用的电子设备性能。
13 2
|
6天前
|
算法 调度
操作系统中的进程管理与调度
【8月更文挑战第14天】在现代计算机系统中,操作系统扮演着至关重要的角色。它不仅负责管理硬件资源,还提供了进程管理的机制来协调多个程序的执行。本文将深入探讨操作系统如何通过进程管理与调度来优化资源使用和提高系统响应性。我们将从进程的概念出发,分析进程状态转换、进程调度算法及其对系统性能的影响。通过理解这些概念,读者将能够更好地把握操作系统的核心原理及其在实际场景中的应用。
|
1月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
19天前
|
算法 调度 Python
探索操作系统的心脏:深入理解进程调度
【8月更文挑战第1天】在数字世界的每一次跳动中,有一个不可见的手在操纵着一切——那就是进程调度。本文将带你穿梭于现代操作系统的核心,揭开进程调度机制的神秘面纱。通过直观的代码示例和详细的分析,我们将共同见证这一技术如何在微观层面影响宏观世界的运行。让我们开始这场深入操作系统内核的探险之旅吧!
|
19天前
|
算法 调度
探索操作系统的心脏:深入理解进程调度
【7月更文挑战第31天】在数字世界的脉络中,操作系统扮演着至关重要的角色,它如同一台精密的时钟,确保了计算资源的高效与有序。本文将通过浅显的语言和实例代码,带领读者走进操作系统的核心——进程调度。我们将一起探索它是如何在多任务环境中协调资源、管理进程,并保证系统的流畅运行。文章不仅阐释进程调度的基本概念,还将通过实际代码示例揭示其背后的原理,使读者对这一复杂机制有一个清晰的认识。
27 10
|
18天前
|
算法 调度 UED
深入理解操作系统:进程调度与优先级反转
【8月更文挑战第2天】在操作系统的心脏中,进程调度是维持多任务并发执行的关键机制。本文将通过一个简化的Python代码示例,揭示进程调度背后的逻辑,并探讨优先级反转现象及其对系统性能的影响。我们将从基础概念出发,逐步深入到进程调度算法的实现,最终讨论如何优化调度策略以提升系统响应性和效率。
|
19天前
|
算法 Linux 调度
深入理解操作系统:进程调度与优先级
【7月更文挑战第31天】在计算机科学中,操作系统是连接用户和硬件的桥梁。它管理着计算机的资源,并确保资源的公平分配。本文将深入探讨操作系统的一个重要组成部分——进程调度,以及如何通过优先级来优化系统性能。我们将通过代码示例,展示如何在Linux系统中实现一个简单的优先级调度算法。
24 4

热门文章

最新文章