当我遇到以下情况时会发生什么:
A 类:保留动态分配的对象 B。它将创造和摧毁这些。
B类:有一个由A调用的execute函数。execute将fork(),子进程将使用execvp来运行另一个进程。但是,可以设置一个标志,以便父进程不会等待子进程(允许其在后台运行)。
我的问题是,在这种情况下 fork 在做什么?我知道孩子有父母过程的完整副本,但我有点困惑。那么这是否意味着子进程有自己的对象 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++ 析构函数。但是,这对父进程没有任何影响。
因此,孩子和进程之间不存在干扰。父母是否等待孩子并不重要。一旦fork()
返回(成功)到父进程,子进程独立运行,父进程对分配的变量所做的任何操作都不会影响子进程。
如果您真的很努力并通过放置将共享内存和变量分配到共享内存中new
如果孩子在调用之前清理共享内存中的变量execvp()
,或者其他一些类似牵强但实际上并非不可能的情况,那么孩子和父母并不是完全独立的。但是,如果您正在做如此复杂的事情,您可能也不会问这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)