操作系统实验一之进程的创建实验

一、题目

  1. 运行程序,解释现象
void main(){
   int pid1=fork();
   printf(“**1**\n”);
   int pid2=fork();
   printf(“**2**\n”);
   if(pid1==0){int pid3=fork();printf(“**3**\n”);}
   else printf(“**4**\n”);
}
  1. 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。

  2. 下面程序将在屏幕上输出的字符‘X’、数字“1” 和“0”各多少个?为什么?

#include
#include
#include
int main(){
    int i, a = 0;
    pid_t pid;
    if((pid = fork())) a = 1;
    for(i=0;i<2;i++){
        printf("X" );
    }
    if(pid == 0) printf("%d\n", a);
    return 0;
}

如果将上面main函数修改如下,则屏幕上输出的字符‘X’、数字“1”和“0”各多少个?为什么?

#include
#include
#include
int main(void){
    int i, a = 0;
    pid_t pid[2];
    for(i=0;i<2;i++){
        if((pid[i] = fork())) a = 1;
        printf("X" );
    }
    if(pid[0]==0) printf("%d\n",a);
    if(pid[1]==0) printf("%d\n", a);
    return 0;
}

二、实验过程及分析

小实验一:

  1. 运行结果
    操作系统实验一之进程的创建实验_第1张图片
  2. 分析解释
    (1) 调用fork()可以创建进程。不过,fork是把进程当前的情况拷贝一份,执行fork时,进程只拷贝下一个要执行的代码到新的进程。
    (2) fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
     0 在子进程,fork返回值为0
     >0 在父进程,fork返回值为子进程的ID,一个大于0的数
     -1 创建进程失败,返回-1
    (3)该程序的执行方式如下:
    操作系统实验一之进程的创建实验_第2张图片
      本次执行过程中,父程序先执行,子程序后执行,因此运行结果如第一张图。

小实验二:

1. 代码如下:

#include
void main(){
    int pid1, pid2;
    while((pid1 = fork()) == -1);
    if(pid1 == 0) printf("b\n");
    else{
        while((pid2 = fork()) == -1);
        if(pid2 == 0) printf("c\n");
        else printf("a\n");
    }
}

* 2. 运行结果:*
这里写图片描述

3. 分析
  每次调用都会创建一个子程序,而在子程序中,fork()返回值为0,即pid == 0 为true. 所以,两个子程序输出了“b”“c”,而父程序输出“a”.

小实验三:

1. 第一个程序
这里写图片描述
  输出了4个“X”,1个“0”,和0个“1”。因为尽管父进程中,a被赋值为1,但是父进程里无法输出a;而子进程没有给a重新赋值,所以只输出了a的初始值0;由于子进程和父进程分别输出了两个“X”,所以共输出了4个“X”。

2. 第二个程序
这里写图片描述
  输出了8个“X”,2个“0”,和2个“1”。printf(“X”)并不会立即将“X”输出到屏幕,而是首先存储在缓冲区,在遇到下一个输出前,才会将其输出;创建子进程的过程中,同样会将父进程缓冲区的内容复制一份。示意图如下:
  操作系统实验一之进程的创建实验_第3张图片

  以上是本次实验所有内容,希望对大家有所帮助。

你可能感兴趣的:(操作系统实验)