例如,如果我有这样的代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int *ptr;
int
main(void)
{
ptr = malloc(sizeof(int));
if (ptr == NULL)
return (1);
if (fork() == 0) {
(*ptr)++;
printf("in child process\n");
printf("%d\n", *ptr);
}
(*ptr)++;
printf("%d\n", *ptr);
return (0);
}
我想知道当子进程启动并复制内存时,是指针ptr的副本被创建,还是它指向的实际内存也被复制。简而言之,我想知道是否会发生datarace,在孩子和父母之间,或者每个人都有一个指向内存中不同位置的指针ptr的不同副本,或者每个人都有一个指向内存中相同位置的指针的不同副本。
想知道当我使用指针存储变量时会发生什么,
1条答案
按热度按时间jhdbpxl91#
这不会导致比赛。
fork()
创建一个新进程(不是线程),并拥有所有变量的副本。从手册页:fork()创建一个新进程。新进程(子进程)是调用进程(父进程)的精确副本,但以下情况除外:
请注意,
(*ptr)++;
会导致UB,因为ptr
指向未初始化的内存。