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

233 阅读3分钟
    *   [二、vfork以及execl的使用](about:blank#vforkexecl_88)

    *   [三、创建进程以及进程间通信(管道)的综合运用](about:blank#font_colorFF0000font_213)

*   [实验代码和报告](about:blank#_276)

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


实验目的


  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);