一、实验目标
掌握fork()创建子进程,以及判断系统调用父进程和子进程的顺序.
二、实验内容
1.思路
fork系统调用创建子进程,判断返回值pid,若pid<0,则打印Fork Failed,若pid==0,则打印I am a Child,否则打印I am a Parent.
用test.sh将程序运行100遍观察运行结果.
2.代码
3.过程及运行结果展示
编译并运行 fork.c 程序
利用 test.sh 脚本程序,运行 fork 程序 1000次,查看运行结果
有wait时,子进程先运行,父进程后运行.
把 fork.c 程序中的 wait(NULL) 注释掉, 即等待子进程结束的代码行注释掉,重新运行 test.sh 程序,查看运行结果
无wait时发生了错位,所以可见第995次是子进程先运行,所以子进程和父进程运行的顺序在无wait时是不一定的.
三、实验结论
利用fork()调用创建子进程,创建的子进程和父进程是完全一样的。若父进程等待,即有wait(),则子进程会先运行,父进程等待子进程结束后运行;若父进程不等待,即没有wait(),则子进程和父进程的运行顺序是不可预测的,可能会交替运行.
附录:代码
//fork.c 文件
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>
int main(){
pid_t pid;
/* fork another process */
pid =fork();
if(pid < 0){/* error occurred */
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if(pid == 0){/* child process*/
printf("I am a Child\n");
}
else {/* parent process */
/* parent will wait for the child to complete */
/* wait(NULL); */
printf("I am a Parent\n");
exit(0);
}
return 0;
}
//test.sh 文件
#! /bin/bash
for((i=1;$i<=1000;i++));
do
echo $i
./fork
done