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

标签 c++ linux memory-management fork

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

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/

相关文章:

c++ - 此指针错误没有构造函数的实例与参数列表匹配

linux - Bash脚本,如果语句

linux - 仅在出现时剪掉多余的线条。 Linux

Python:数据在内存中的有效存储

c++ - 对于没有节点类的 DAG,哪种数据结构最有效?

c++ - 从 C++ 类外部访问私有(private)静态方法

c++ - c++ by-ref参数传递如何在汇编中编译?

linux - DPDK解绑后如何领取网卡?

memory - 谷歌云平台 : how to monitor memory usage of VM instances

c# - 在 .NET 等托管环境中是否可能发生内存泄漏?