#Linux#folk()函数

最近做了一次实验:
    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()函数放入父进程即可实现),加油鸭。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值