Освобождение ресурсов C ++ и fork-exec?

Я пытаюсь создать новый процесс из моего C ++ - проекта с помощью fork-exec. Я использую fork-exec для создания двунаправленного канала для дочернего процесса. Но я боюсь, что мои ресурсы в разветвленном процессе не будут освобождены должным образом, поскольку exec-вызов полностью возьмет на себя мой процесс и не будет вызывать никаких деструкторов.

Я попытался обойти это, выбрасывая исключение и вызывая execl из блока catch в конце main, но это решение не уничтожает ни одного одиночного объекта.

Есть ли какой-нибудь разумный способ безопасно достичь этого? (мы надеемся избежать взлома atExit)

Пример: следующий код выводит:

We are the child, gogo!
Parent proc, do nothing
Destroying object

Несмотря на то, что разветвленный процесс также имеет копию синглтона, который необходимо уничтожить перед вызовом execl.

#include <iostream>
#include <unistd.h>

using namespace std;

class Resources
{
public:
    ~Resources() { cout<<"Destroying object\n"; }
};

Resources& getRes()
{
    static Resources r1;
    return r1;
}

void makeChild(const string &command)
{
    int pid = fork();
    switch(pid)
    {
    case -1:
        cout<<"Big error! Wtf!\n";
        return;
    case 0:
        cout<<"Parent proc, do nothing\n";
        return;
    }
    cout<<"We are the child, gogo!\n";
    throw command;
}

int main(int argc, char* argv[])
{
    try
    {
        Resources& ref = getRes();
        makeChild("child");
    }
    catch(const string &command)
    {
        execl(command.c_str(), "");
    }
    return 0;
}
6
задан zwol 12 January 2011 в 00:25
поделиться