修改跨 fork() 的指针中的数据
Modify data in a pointer across fork()?
假设我声明了一个类...
class foo {
public:
int i;
foo(int j) { i = j; }
};
然后,我在代码中使用它,如下所示:
foo *bar = new foo(17);
cout << "Bar is " << bar->i << endl;
if (!fork()) {
bar->i = 2;
exit(0);
}
cout << "Bar is now " << bar->i << endl;
我用g++
编译它并运行可执行文件。我得到以下输出:
me@computer:~$ ./a.out
Bar is 17
Bar is now 17
我有一个类似的问题,我需要指向在if (!fork())
块中修改的类(比示例稍微复杂一些(的指针。有什么办法可以做到这一点吗?
我能够将这个类与字符串相互转换,如果这样可以更容易的话。我正在使用 C++11 和 cmake
,如果相关的话。
更新:线程现在正在为我创造奇迹。谢谢大家。以下是我所做的,基本上:
void blob(foo *bar)
{
bar->i = 2;
}
int main()
{
foo *bar = new foo(17);
thread th (blob,bar);
th.detach();
delete bar;
return 0;
}
一旦
你做了分叉,你就会产生一个完全不同的进程,有一个完全独立的(但最初是重复的(内存。无论您修改什么,都不会反映在主进程中,反之亦然(在分叉之后(。
为此,您需要使用线程。
分叉后,新的子进程将具有独立的地址空间。 父项中的任何更改对子项不可见,子项中的任何更改对父项不可见。 现在在幕后,大多数 fork 实现都使用写入时复制,因此它只在父级或子级开始写入物理 RAM 时复制一页物理 RAM,但这都是对用户进程隐藏的。
您需要使用线程或某种进程间通信。 有很多方法可以做到这一点,所有方法都有自己的权衡。
相关文章:
- 检查输入 std::array 指针数据是否等于某个常量数组
- 指针数据类型变量如何包含对象?
- 如何在C++中使用类对象访问指针数据成员
- 如何强制实施有关指针数据成员的常量正确性
- 为什么指针>数据有效,而 *double_pointer->data 不起作用?
- 如何从C++中的原始指针数据构造张量流::张量
- 检查课程是否具有指针数据成员
- 处理类的指针数据成员的动态内存
- 在堆上启动的指针数据成员
- 具有指针数据类型的非类型函数模板参数
- 如何将复杂的指针数据作为属性放入qt-plugin-xml文件中
- C++指向函数作为参数的指针.数据类型不兼容
- 初始化指针数据结构的空间复杂性
- 运算符重载与 C++ : 具有指针数据成员的类
- 我是否需要清理非指针数据成员
- 在堆或堆栈上的指针类实例中分配C++非指针数据成员
- 函数结束后丢失指针数据
- C++ 如何确保复制构造函数不会修改原始对象的指针数据成员?
- 为什么从派生类访问基类的数据时会返回无意义的数据(我认为是指针数据)
- 将原始鼠标/指针数据转换为有意义的内容