OS第二篇:进程创建fork()函数实验

    最近做了一次实验:
    1.编写一段程序,利用系统调用fork()函数创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符串,其中,每个进程显示其pid值,及其父进程的pid值。(getpid返回当前进程标识,getppid返回父进程标识。)类似如下显示:父进程显示’"我是爸爸.pid:…爸爸的爸爸是ppid:… ",子进程分别显示’"我是大儿子.pid:…, 我的爸爸是ppid:… "和’“我是小女儿.pid:…, 我的爸爸是ppid:…”。试观察并分析屏幕上的显示结果。
    2. 运行终端,在执行程序之前执行命令“ps -af”,执行程序之后,通过在多进程执行过程中执行命令“ps -af”,显示当前进程状态。试观察并分析屏幕上的显示结果。
接下来阿伟将给大家详细讲解,大家注意听哦:
一、我们先来了解什么是fork()函数:
    一个进程包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,即两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
    一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同,相当于克隆了一个自己。
    一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。
    :为什么fork会返回两次?
    :在复制时复制了父进程的堆栈段,所以两个进程都停留在fork函数中,等待返回。因此fork函数会返回两次,一次是在父进程中返回,另一次是在子进程中返回,这两次的返回值是不一样的。
二、代码实现
    代码1:

#include <stdio.h>
#include<unistd.h>
int main(){
	int pid;
	pid=fork();
	int i = 0;
	for(i=0;i<2;i++){
		if(pid==0){
			printf("我是大儿子,我的pid是 %d.\n",getpid());
		}else if(pid>0){
			printf("我是父亲 ,我的pid是 %d.\n",getpid());
			pid=fork();
			if(pid==0){
				printf("我是小女儿,我的pid是 %d.\n",getpid());
			}else if(pid>0){
				printf("我是父亲,我的pid是 %d.\n",getpid());
			}else{
				printf("fork() error.\n");
			}
		}else{
			printf("fork() error.\n");
		}
	}
	return 0;
}

结果截图:
在这里插入图片描述
    代码2:

#include <unistd.h> 
#include <stdio.h>  
int main(void)
{  
  pid_t fpid; //fpid表示fork函数返回的值 
  printf("hello\n");
  
  fpid=fork(); 
  if (fpid<0){
    printf("error in fork!");
  }
  else if (fpid==0){
    while(1){
    printf("我是大儿子%d,我爸爸是%d.\n",getpid(),getppid());
    sleep(1);
    }
  }else{
    fpid=fork();
    if (fpid<0){
      printf("error in fork!");
    }
    else if (fpid==0){
      while(1){
        printf("我是小女儿%d,我爸爸是%d.\n",getpid(),getppid());
        sleep(2);
      }
    }else{
      while(1){
        printf("我是爸爸%d,爸爸的爸爸是%d.\n",getpid(),getppid());
        sleep(3);
      }
    }
  }
  return 0;
}

结果截图
在这里插入图片描述
三、分析与总结
    从进程并发执行来看,上面的三个进程没有同步措施,只要进程就绪就可能执行,因此各种执行顺序都有可能,所以三个进程的输出次序带有随机性。并且,每当一个进程执行了一段时间,其它就绪进程可能抢占处理机,因此,多个进程可能交错执行。不过,操作系统实现函数printf( )时,保证了进程每次调用该函数输出一个字符串时不会被中断。本次实验虽然有些难度,但大家不要灰心,仔细想想问题还是能够得到解决的(把fork()函数放入父进程即可实现),加油鸭。

如果对您有帮助的话,点个赞再走呗!

发布了30 篇原创文章 · 获赞 72 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/H_W_1212/article/details/89681152