g ++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3. Отредактировано для ясности.
У меня есть общая библиотека, в которой я хочу что-то сделать при первой загрузке и когда на нее больше нет ссылок.
Я пробовал два способа сделать это с одинаковым результатом. Первый был , используя предложение по этой ссылке . Вторым было создание глобального экземпляра класса внутри библиотеки.
Каждый работал одинаково. Затем я создал тестовую программу, которая использует библиотеку и fork () из процесса. Оказывается, конструктор вызывается только один раз, а деструктор вызывается дважды - один раз для каждого процесса.
Это ожидаемое поведение для разделяемых библиотек и fork (), или я здесь что-то не так делаю? Кажется очень опасным, чтобы dtors вызывался для каждого процесса, а ctor вызывался только один раз.
Общая библиотека (g ++ -fPIC -c -o myshare.o myshare.cpp / g ++ -shared -o libmyshare.so myshare.o):
class SharedMemAccess
{
public:
SharedMemAccess();
~SharedMemAccess();
};
static SharedMemAccess g_sharedMem;
SharedMemAccess::SharedMemAccess()
{
LOGDEBUG("Constructor\n");return;
}
SharedMemAccess::~SharedMemAccess()
{
LOGDEBUG("Destructor\n");return;
}
Тестовый драйвер (g ++ -c -o main.o main.cpp / g ++ main.o -lmyshare -o test):
int main()
{
LOGDEBUG("In main\n");
pid_t rc = fork();
if (rc == -1) LOGDEBUG("fork failed\n");
else if (rc == 0) ChildProcess();
else ParentProcess();
return 0;
}
void ChildProcess()
{
LOGDEBUG("Child process spawned.\n");
usleep(10 * 1000 * 1000);
LOGDEBUG("Child process exiting.\n");
}
void ParentProcess()
{
LOGDEBUG("Parent process spawned.\n");
usleep(5 * 1000 * 1000);
LOGDEBUG("Parent process exiting.\n");
}
Выход:
16:10:28 SharedMemAccess( 59): Constructor
16:10:28 main( 25): In main
16:10:28 ParentProcess( 62): Parent process spawned.
16:10:28 ChildProcess( 47): Child process spawned.
16:10:33 ParentProcess( 72): Parent process exiting.
16:10:33 ~SharedMemAccess( 133): Destructor
16:10:38 ChildProcess( 57): Child process exiting.
16:10:38 ~SharedMemAccess( 133): Destructor
Спасибо,
-Joe