我有一个C ++程序,可以让子进程执行一些工作。在这些子进程中,创建了一些类,并且在成员函数中有一个静态变量,如下所示:
void MyClass::foo () {
static std::string uuid;
...
uuid = "A new value";
}
由于每个进程都是新分叉的,我假设uuid始终被初始化为空字符串。但是,在某些情况下,我注意到uuid已经在函数的第一次输入时被赋予了值,这会导致问题。
如何在分叉进程中初始化此静态变量?并且我是使用类变量的唯一选择吗?静态变量的原因是我不想引入只在单个函数中使用的类变量,以保持类的整洁。
答案 0 :(得分:3)
我发现在极少数情况下,MyClass也会在父进程中实例化。之后,分叉进程继承静态变量,该变量已使用父进程中的值进行初始化。
答案 1 :(得分:2)
当第一个进程启动时,二进制可执行文件将映射到内存中,其不同的部分都会在内存中终止(.bss,.text等)。由于数据部分映射到内存中,因此静态变量指向映射的.data部分的偏移量。
现在当一个进程分叉时,创建的进程被授予自己的虚拟内存空间,这是其父进程的完美副本(在分叉时)。 “uuid”指向自己的记忆区。
旁注:内核允许孩子们的虚拟页面映射到与父母相同的物理页面,只要他们不是两个进程都不会修改它们。