Процесс не видит именованый мьютекс

Тема в разделе "WASM.BEGINNERS", создана пользователем piligmindo, 13 дек 2019.

  1. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Привет!

    Как обычно, ничего не работает. По задаче нужно перезапустить собстенный процесс. Т.е. что бы осталась работать только дочерняя копия, а родительский завершился. Делаю так:

    Код (C):
    1.  
    2. #include <iostream>
    3. #include <Windows.h>
    4.  
    5. using namespace std;
    6.  
    7. int main()
    8. {
    9.     HANDLE hExit = CreateEventW(NULL, TRUE, FALSE, L"12345");
    10.     cout << "CreateEvent: " << hExit << endl;
    11.  
    12.     HANDLE mutex = CreateMutexW(NULL, FALSE, L"123");
    13.     cout << "CreateMutexW: " << mutex << endl;
    14.  
    15.     DWORD err = GetLastError();
    16.  
    17.     if (err == ERROR_ALREADY_EXISTS)
    18.     {
    19.         cout << "ERROR_ALREADY_EXISTS\n";
    20.         SetEvent(hExit);
    21.     } else {
    22.  
    23.         Sleep(3000);
    24.         cout << "Create copy...\n";
    25.  
    26.         STARTUPINFO si;
    27.         ZeroMemory(&si, sizeof(STARTUPINFO));
    28.         PROCESS_INFORMATION pi;
    29.  
    30.         if (CreateProcess(L"1.exe", NULL, NULL, NULL, FALSE, NULL, NULL, NULL, &si, &pi) == TRUE)
    31.         {
    32.             cout << "ProcessCreate OK\n";
    33.         }
    34.     }
    35.  
    36.     SetEvent(hExit);
    37.     cout << "WaitForSingleObject...\n";
    38.  
    39.     if (WaitForSingleObject(hExit, 0) != WAIT_TIMEOUT)
    40.     {
    41.         ExitProcess(0);
    42.     }
    43.  
    44.     cout << "OK!!!\n";
    45.     Sleep(10000);
    46.  
    47.     return 0;
    48. }
    Такое впечатление, что порожденный процесс не видит созданный мьютекс. Для того, что бы все работало, исполняемый файл должен называться 1.exe
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Непонятно чего ты хочешь добиться нагородив эвентов и мутексов. Если процесс успешно создался можно смело завершать старый, новый пусть в цикле с OpenMutex ждет пока мутант исчезнет и создает свой, если тебе надо не больше одной копии процесса. Смотри в сторону lpMutexAttributes, который If this parameter is NULL, the handle cannot be inherited by child processes, хотя приведенный пример будет работать и с NULL, там не подразумевается передача хендла.
     
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    piligmindo,

    Обьект для ipc должен быть глобальным в системе. Иначе он уничтожается при окончании счётчика ссылок на него, те при завершении процесса.
     
  4. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Идея была такова:
    1. запуск 1.ехе
    2. 1.ехе запускает сам себя
    3. "первый" 1.ехе завершается, второй работает

    Вы можете как то примерно показать на коде?

    А именованый мьютекс разве не глобальный системный обьект?
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Код (ASM):
    1. invoke GetTickCount
    2. mov [nStartTickCount],eax
    3. pushdatanp db '123'\,0
    4.     SYNCHRONIZE = 0x100000
    5.     MUTANT_QUERY_STATE = 1
    6.     MUTANT_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED + SYNCHRONIZE + MUTANT_QUERY_STATE
    7.     @@:
    8.     invoke OpenMutexA,MUTANT_ALL_ACCESS,0,esp
    9.     test eax,eax
    10.     .if ~ZERO?
    11.         invoke CloseHandle,eax
    12.         invoke Sleep,50
    13.         invoke GetTickCount
    14.         sub eax,[nStartTickCount]
    15.         cmp eax,5000
    16.         jl @B
    17.     .else
    18.         invoke CreateMutexA,0,0,esp
    19.         ...
    20.     .endif
    21. popdata
     
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    piligmindo,

    Я не смотрел ваш код, обьект должен быть помечен перманентным, иначе хоть его видит система, но ядро его прикончит при завершении родителя.
     
  7. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    f13nd, так если процесс запускает сам себя, то каждая копия будет крутить этот цикл...

    А как его пометить перманентным? И как потом убрать его?
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
    Будет крутить 5 секунд, если мутекс никто не освободит пойдет лесом. Если освободят, займет одна копия. Самое тупое - ввести параметр командной строки, так вторая копия поймет, что запущена в качестве второй копии, для этого евенты не нужны. И мутексы тоже.
     
  9. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Спасибо, буду думать.

    Я думал об этом, и тоже понял, что это "самое тупое":)
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
  11. piligmindo

    piligmindo Member

    Публикаций:
    0
    Регистрация:
    31 дек 2018
    Сообщения:
    69
    Оооо! Крутая дока, спасибо огромное!:good2:
     
  12. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    Не принципиально, но этот SetEvent не имеет смысла...:boast:
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    piligmindo,

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

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Как вариант можно создать переменную окружения, а вторым процессом ее удалить. (если вдруг не катит командная строка).
    А вообще вариантов масса.
    Например можно проверить кто родитель процесса. (ProcessEntry32.th32ParentProcessID)
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    TermoSINteZ,

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

    Смысл в том, что нужно создать обьект, который не завершается при завершении родителя. А синхронизации и вовсе не нужны. Как установить маркер в OA я хз.

    https://docs.microsoft.com/en-us/wi...licy-settings/create-permanent-shared-objects

    Есть для этого ядерная апи, можно посмотреть обёртку. Пусть тс это сделает сам. Рекомендовано изучать сурки нт, чтобы такие вопросы не появлялись.
     
    Последнее редактирование: 14 дек 2019