6.S081:1.关于fork()的思考
1.fork
int pid = fork(); //创建一个进程,返回子进程的PID
1.1fork用法
一个进程可以使用fork()
系统调用创建一个新的进程(称为子进程),fork()创建了一个新的进程
,其内存
与父进程完全一样,fork在子进程中返回0
,父进程中返回子进程的PID
。
1.2fork疑云
且看一个例子:
#include <unistd.h>
#include <stdio.h>
int main(){
int count = 0;
int pid = fork();
if (pid < 0)
printf("fork error\n");
else if(pid == 0)
count++, printf("pid = %d count_ad = %p : %d\n", getpid(), &count, count);
else
count++, printf("pid = %d count_ad = %p : %d\n", getpid(), &count, count);
return 0;
}
输出如下:
pid = 240 count_ad = 0x7ffdb7979330 : 1
pid = 241 count_ad = 0x7ffdb7979330 : 1
这里会产生一个疑问,既然两个进程并未共享count
变量,那么对count自增操作自然是分别独立
进行,也就是最终结果都是count
=
1,但count的地址
却相同,纠结的点在于如果变量的地址相同,那第二次执行自增的count
= 2
问题解决:
由于fork()系统调用会产生一个新的进程,而在每个进程眼中,自己都
独享整个内存地址空间
,也就是说,child->count_ad虽然和parent->count_ad逻辑地址相同
,但其实际物理地址不同
。