Давайте начнем с фона. Share Memory используется для hotfix
в нашем игровом проекте. Как это работает? Все стабильные данные хранятся в общей памяти, мы создадим новый исполняемый файл при изменении logi c (исправим ошибки всегда), затем остановим старый процесс и начнем новый. Новый процесс находит существующую общую память и восстанавливает все данные из общей памяти.
Но иногда один или два процесса повторно присоединяются неудачно, когда мы перезапускаем почти 20 процессов, а _errno()
возвращает EAGAIN
, Подробно ниже приведен снимок исходного кода:
HANDLE hShmID = shmget(iKey, iSize, IPC_CREAT | IPC_EXCL | 0666);
if ((int64_t)hShmID) < 0) // hShmID == -1, when restart
{
if (_errno() != EEXIST) // sometimes _errno() == EAGAIN !!!
{
printf("failed");
return;
}
// process restart as hotfix, re-attach shamre memory
}
else
{
// process start as first time, create new share memory
}
Мои вопросы таковы:
- что произошло, когда мы позвонили
shmget
. EAGAIN
означает Resource temporarily unavailable
, но в моей идее нет разногласий по поводу ресурсов. Поскольку каждый процесс присоединяет свой файл общей памяти (только последняя остановка, а затем повторное присоединение нового).
спасибо за чтение.