栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

文章目录
  • 操作系统实验——进程创建与进程间通信
    • 实验目的
    • 实验内容
      • 一、创建进程树
      • 二、vfork以及execl的使用
      • 三、创建进程以及进程间通信(管道)的综合运用
    • 实验代码和报告

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


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

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


实验分析:

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

代码如下:

#include
#include
#include 
#include
#include

int main()
{
  pid_t pida,pidb,pidc,pidd;
  while((pidb=fork())==-1);
  if(pidb>0) 
    {
    	wait(0); 
      	printf("Apid=%d,ppid=%dn",getpid(),getppid());
    }
  else  //p
   {
     while((pidc=fork())==-1);
     if(pidc>0)   
       	{	
       	 wait(0); 
         printf("Bpid=%d,pidd=%dn",getpid(),getppid());
		}
     else //p
       {
		while((pidd=fork())==-1);
	     	if(pidd >0)   //p2
	      	{
	      		wait(0); 
				printf("Cpid=%d,pidd=%dn",getpid(),getppid());
			}
	     	else //p
	        {	
				printf("Dpid=%d,pidd=%dn",getpid(),getppid());
			}   
	    }   
    }

}

运行结果:


同样的思路,图二中的创建流程为:
由父进程a同时建立b,c子进程,再由b进程创建d子进程,c子进程再创建e、f子进程

运行结果如下:


二、vfork以及execl的使用

实验要求一:

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

代码如下:

#include
#include
#include 
#include
#include
#include
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 %dn",getpid(),getppid());
			_exit(0);
		}
		else
		{
			wait(0);
			num++;
			printf("Bpid is %d , Bppid is %dn",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 %dn",getpid(),getppid());
				_exit(0); 
			}
			else
			{
				while((pid5=vfork())==-1);
				if(pid5 == 0)
				{
					wait(0);
					num++;
					printf("Epid is %d , Eppid is %dn",getpid(),getppid());
					_exit(0);
				}
				else
				{
					wait(0);
					num++;
					printf("Cpid is %d , Cppid is %dn",getpid(),getppid());
					_exit(0);
				}	
			}			
		}
		else
		{
			wait(0);
			printf("Apid is %d , Appid is %dn",getpid(),getppid());
			printf("childnum is %dn",num);			
		}
	}
}

实验结果:


实验要求二:

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

代码如下:

#include
#include
#include 
#include
#include
#include
int main(){
	pid_t pid1;
	while((pid1=fork())==-1);
	if(pid1==0)
	{
		wait(0);
		printf("This is childn");
	}
	else
	{
		printf("This is fathern");
		execlp("./test3","5a",NULL);
	}
}

实验结果:


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

实验要求:

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

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


加密代码:

//encrypt.c

#include
#include
#include
#include
int main(int argc,char * argv[])
{
   int i=0;
   int len;
   if(argc<=1) {printf("%dn",argc);return 0;}
   char * s =argv[1];
   printf("启动后台加密进程,进程号:%dn",getpid());
   len = strlen(s);//取长度
   for(i=0;i64 && 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("加密后:%sn",s);   
    return 1;  
}


具体代码:

见底部文件


实验结果:



实验代码和报告

文件下载地址

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951428.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号