我是靠谱客的博主 激动小刺猬,最近开发中收集的这篇文章主要介绍#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("hellon");
  
  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()函数放入父进程即可实现),加油鸭。

最后

以上就是激动小刺猬为你收集整理的#Linux#folk()函数的全部内容,希望文章能够帮你解决#Linux#folk()函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部