что случилось, когда shmget установил ошибку с EAGAIN? - PullRequest
0 голосов
/ 07 января 2020

Давайте начнем с фона. 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
}

Мои вопросы таковы:

  1. что произошло, когда мы позвонили shmget.
  2. EAGAIN означает Resource temporarily unavailable, но в моей идее нет разногласий по поводу ресурсов. Поскольку каждый процесс присоединяет свой файл общей памяти (только последняя остановка, а затем повторное присоединение нового).

спасибо за чтение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...