一、题目
- 运行程序,解释现象
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”);
}
编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。
下面程序将在屏幕上输出的字符‘X’、数字“1” 和“0”各多少个?为什么?
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
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<stdio.h>
#include<sys/types.h>
#include<unistd.h>
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) 调用fork()可以创建进程。不过,fork是把进程当前的情况拷贝一份,执行fork时,进程只拷贝下一个要执行的代码到新的进程。
(2) fork调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:
0 在子进程,fork返回值为0
>0 在父进程,fork返回值为子进程的ID,一个大于0的数
-1 创建进程失败,返回-1
(3)该程序的执行方式如下:
本次执行过程中,父程序先执行,子程序后执行,因此运行结果如第一张图。
小实验二:
1. 代码如下:
#include<stdio.h>
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”输出到屏幕,而是首先存储在缓冲区,在遇到下一个输出前,才会将其输出;创建子进程的过程中,同样会将父进程缓冲区的内容复制一份。示意图如下:
以上是本次实验所有内容,希望对大家有所帮助。