fork()函数
fork()的基础知识
- 父进程通过调用fork函数来创建一个新的运行的子进程。
- 父进程和子进程之间最大的区别就是PID不同
1)在父进程中,fork返回新创建子进程的PID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值
fork()的特点
-
调用一次,返回两次
一次只在调用进程(父进程)中,fork返回子进程的PID。
一次是在新创建的子进程中,fork返回0。 -
并发执行
父进程和子进程是并发运行的独立进程。
内核能够以任意方式交替执行他们的逻辑控制流中的指令。 -
相同但是独立的地址空间
父进程和子进程会有相同的用户栈、相同的本地变量值、相同的堆、全局变量以及代码。
但是,父进程和子进程都是独立的进程,他们都有自己的私有地址空间。 -
共享文件
子进程可以读写父进程中打开的任何文件
有关fork()代码分析
在看代码之前我们要了解一下有关 进程图 的知识:
-
进程图是刻画程序语句偏序的一种简单的前驱图,每个顶点a对应于一条程序语句的执行
有向边a—>b代表a发生在语句b之前,边上可以标记一些信息,例如一个变量的当前值。 -
画出 进程图 方便我们理解fork调用程序的情况
1.让我们看几个最基本的嵌套循环的例子
void fork1()
{
int x = 1;
pid_t pid = fork();
if (pid == 0) {
printf("Child has x = %d\n", ++x);
}
else {
printf("Parent has x = %d\n", --x);
}
printf("Bye from process %d with x = %d\n", getpid(), x);
}
运行结果和流程图:
void