fork()函数使用–实验
实验目的:理解程序创建新进程的方法,观察并发执行的现象。
实验原理:fork()建立子进程,子进程得到父进程地址空间的一个复制
实验内容:首先分析一下程序运行时其输出结果有哪几种可能性,然后实际调试该程序观察其实际输出情况,比较两者的差异,分析其中的原因。
void main(void){
int x=5;
if(fork()){
x+=30;
printf("%d\n",x);
}
else
printf("%d\n",x);
printf("%d\n",x);
}
实验过程:
实验源码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
int x=5;
if(fork()) {
x+=30;
printf("%d\n",x);
} else
printf("%d\n",x);
printf("%d\n",x);
return 0;
}
实验结果:
(1) 5 5 35 35
(2) 35 35 5 5
结果分析:fork ()函数是程序创建子进程的调用函数,若子程序创建成功,则对子程
序返回0,对父进程返回子程序的D;若不成功,则返回-1。
子进程和父进程的可执行程序是同一个程序,上下文和数据,绝大部分就是
原进程(父进程)的拷贝,但它们是两个相互独立的进程,fork)以后, 子进程
就相当于父进程的兄弟一样了。这个子进程和父进程不同的地方只有他的进程
ID和父进程D其他的都是一样.fork之后父子进程除非采用了同步手段,否则不
能确定谁先运行,也不能确定谁先结束。因此父子进程在执行过程中,是竞争的
关系不能够确定是谁先执行,并且父进程执行过程中,子进程可以抢占资源,执
行子进程。
fork函数:一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。
一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。
fork出错可能有两种原因:
1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。
2)系统内存不足,这时errno的值被设置为ENOMEM。
创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。