Жива ли "родительская" копия

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 26 ноя 2008.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    Мда... код на редкость бредовый.
    Во-первых, Вы проверяете существование не запустившего процесса, а запущенного.
    Во-вторых, Вы передаёте отфанарный указатель на скорее всего несуществующую область памяти. Везёт ещё, что GetExitCodeProcess процесс не валит.
    В-третьих, Вы проверяете равенство этого отфанарного указателя значению STILL_ACTIVE. В общем случае равенство будет достигаться с вероятностью один к четырём миллиардам. Поэтому и вылетает MessageBox.
     
  2. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ошибка вылазит но процесс не валится
    ЗЫ:я хочу что бы копии дург друга мониторили.А почему указатель "отфанарный" его же вроде как CreateProcess возвращает в структуре?
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    Всё сообщение цитировать не надо было.
    Я говорил об указателе, а не о хэндле. CreateProcess возвращает хэндл дочернего процесса в структуре. А указатель - это code, который ничем не инициализирован (о чём, я думаю, компилятор си предупреждает).
    Правильно было бы создавать переменную типа DWORD code. И вызывать так: GetExitCodeProcess(pi.hProcess,&code). А вот это: "code!=(unsigned long*)STILL_ACTIVE", — называется наглым затыканием рта компилятору. Никаких приведений типов здесь не надо.
    Вообще "друг друга" и "родительская копия" - это немного разные вещи. Для "друг друга", наверное, больше подойдёт вариант из поста 3 и эвентуально вспомогательный поток. Хотя подходят все варианты. Можно даже пайп между процессами сделать. Обрыв пайпа означал бы, что один из процессов мёртв.
    Для вариантов с GetExitCodeProcess/WaitForSingleObject (проверка существования родительского процесса), как я написал в посте 4, нужно "дать дочернему процессу унаследовать свой хэндл". А также, разумеется, передать значение этого хэндла дочернему процессу.
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Что то здесь http://msdn.microsoft.com/en-us/library/aa813706(VS.85).aspx невидно такого поля.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    Это поле не PEB, а PROCESS_BASIC_INFORMATION. Ни та, ни та структура полностью официально не документирована. Пользуемся Windows NT 2000 Native API reference (Gary Nebbett).
     
  6. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Существует в природе заголовочный файл с этими обьявленными структурами?
    ЗЫ:ну немогу никак понять смысла с мютексом ,код в том примере для меня абсолютно неясен, ассемблер для меня темный лес :dntknw:
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _nic
    Хватит цитировать сообщения целиком.
    По вопросу не знаю (скорее всего да). Я при необходимости беру из вышеупомянутой книжки или из сети.
    Единственный совет - медитировать до полного просветления, как бы банально это не звучало. Мозг при этом автоматически увеличивает размер доступной кэш-памяти, а также создаст дополнительные ассоциативные связи, что позволит решать более сложные задачи в будущем.
    P.S. Чуть не забыл... на всякий случай специально для Clerk: нет, я не под ПАВ.
     
  8. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Мда ну что я виноват что предпочитаю асму С?Ну создал я мьютекс ,точно с таким же lpName не создать 2й мьютекс.Ну и что мне с первым то делать?Пытатся в цикле создавать пока CreateMutex не престанет возвращять ERROR_ALREADY_EXISTS ? А причем тогда WaitForSingleObject?
     
  9. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Здесь дело не в асме или си. Дело в MSDN. :) Смотрим WaitForSingleObject:

    Процесс пытается создать Mutex. Если Mutex с этим именем уже создан, то он просто получит хэндл к существующему Mutex'у, но не получит права владения Mutex'ом. После этого процесс вызывает WaitForSingleObject, который не вернёт управление, пока поток-владелец не потеряет права владения Mutex'ом (WAIT_ABANDONED в случае завершения потока). Помимо возврата управления WaitForSingleObject также передаст права владения вызвавшему её потоку. Т.о. дочерний процесс будет знать, что родительский завершён, когда WaitForSingleObject вернёт управление.
    P.S. Учимсо учиццо.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    All
    Пользуемсо сорсами винды.
     
  11. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    ВОт что у меня вконце концов вышло
    Код (Text):
    1. TForm1 *Form1;
    2. PROCESS_INFORMATION pi;
    3. STARTUPINFO si;
    4. void thr(void *Pvoid)
    5. {
    6. char fnm[400];
    7. DWORD code;
    8. for(;;)
    9. {
    10. Sleep(300);
    11. GetExitCodeProcess(pi.hProcess,&code);
    12. if(code!=STILL_ACTIVE)
    13. {
    14. MessageBox(0,"!!!","!!!!",MB_OK);
    15. GetModuleFileName(NULL,fnm,400);
    16. memset((void*)&pi,NULL,sizeof(pi));
    17. memset((void*)&si,NULL,sizeof(si));
    18. CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
    19. memset(fnm,NULL,400);
    20. }
    21. }
    22. }
    23. //---------------------------------------------------------------------------
    24. __fastcall TForm1::TForm1(TComponent* Owner)
    25.     : TForm(Owner)
    26. {
    27. }
    28. //---------------------------------------------------------------------------
    29. void __fastcall TForm1::FormCreate(TObject *Sender)
    30. {
    31. char fnm[400];
    32. GetModuleFileName(NULL,fnm,400);
    33. si.cb=sizeof(si);
    34. si.lpReserved=NULL;
    35. si.lpDesktop=NULL;
    36. si.lpTitle=NULL,
    37. si.dwFlags=STARTF_FORCEONFEEDBACK;
    38. si.cbReserved2=0;
    39. si.lpReserved2=NULL;
    40. HANDLE mut=CreateMutex(0,1,"emokillll");
    41. WaitForSingleObject(mut,-1);
    42. CreateProcess(fnm,NULL,NULL,NULL,false,CREATE_NEW_ CONSOLE,NULL,NULL,&si,&pi);
    43. _beginthread(thr,0,0);
    44. }
    Коряво конечно ,но вроде работает так как мне надо.Всем спасибо за помощь.