gpt4 book ai didi

c++ - 堆上的类内的 Linux fork

转载 作者:IT王子 更新时间:2023-10-29 01:11:17 28 4
gpt4 key购买 nike

当我遇到以下情况时会发生什么:

A 类:持有动态分配的对象 B。它将创建和销毁这些。

B 类:有一个由 A 调用的执行函数。Execute 将 fork() 并且 child 将使用 execvp 运行另一个进程。但是,可以设置一个标志,以便父级不会等待子级(允许它在后台运行)。

我的问题是,在这种情况下,fork 做了什么?我知道 child 有 parent 过程的完整拷贝,但我有点困惑。那么这是否意味着子进程有自己的对象 A 持有 B?如果 B 没有等待,但 A 删除了 B,会发生什么情况?

这是一些示例代码。请注意,它是从我实际做的事情中简化而来的。

class B;
class A
{
public:
void addAction( const std::string &name )
{
_bq.push( new B( name ) );
}

void doActions( bool wait = true )
{
while ( !_bq.empty() )
{
B* b = _bq.front();
b->execute( wait );
_bq.pop();
delete b;
}
}

~A() { //omitted, but just deletes everything in queue }

private:
std::queue<B*> _bq;
};

class B
{
public:
B( const std::string &name )
{
args.push_back( name.c_str() );
args.push_back( NULL );
}
void execute( bool waitForChild )
{
pid_t pid = fork();
if ( pid != 0 )
{
if (waitForChild)
{
int status;
wait( &status );
// check status...
}
}
else
{
execvp( args[0], const_cast<char**>( &args[0] ) );
// problem
exit( 100 );
}
}
private:
std::vector<char*> args;
};

最佳答案

子进程完全独立于父进程,并拥有父进程变量的完整拷贝。当子级执行时(调用 execve() 或其亲属之一),不会执行任何 C++ 析构函数。但是,这对父进程没有任何影响。

所以,子进程和进程之间没有干扰。 parent 是否等待 child 并不重要。一旦 fork() 返回(成功)到父进程,子进程就会独立运行,父进程对分配的变量所做的任何操作都不会影响子进程。

如果您真的努力尝试并通过放置 new 将共享内存和变量分配到共享内存中,并且如果 child 在调用 execvp() 之前清理共享内存中的变量>,或者其他一些类似的牵强附会但实际上并非不可能的场景,那么 child 和 parent 并不是完全独立的。但是,如果您正在做如此复杂的事情,您可能也不会问这个问题。

关于c++ - 堆上的类内的 Linux fork,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5062991/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com