6.S081:1.关于fork()的思考


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逻辑地址相同,但其实际物理地址不同


Author: Paranoid
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Paranoid !
评论
  TOC