Я пытаюсь создать новый процесс из моего 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;
}