C++ Вопрос При завершении консоли, завершение другого приложения/процесса c++

already
Пользователь
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
373
Реакции[?]
42
Поинты[?]
0
В общем, при запуске консоли, у меня запускается вторая консоль, лежащая с первой в одной папке
Код:
 system("start console2.exe");
Запуск второй консоли, при запуске первой - дело простое) Но как теперь закрывать вторую, при завершении первой - не понял)

edit:
Слишком мало знаю в ++, пойду гуглить дополнительно

edit2:
Конкретно как просто завершить второй, я знаю. Но как сделать проверку на работу первой - нет)
 
Последнее редактирование:
feel irl
Участник
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
677
Реакции[?]
294
Поинты[?]
16K

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.


Если ты хочешь, что бы у тебя при запуске console1 запускалось console2, и при закрытии console1, console2 закрывалась.
То смотри.
в console1 в мейн пихаешь код
C++:
system("start console2.exe");
в console2 создаёшь новый поток, и пихаешь туда это
C++:
bool isProcessRun(char *processName)
{
    HANDLE hSnap = NULL;
    PROCESSENTRY32 pe32;
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap!=NULL)
    {
        if (Process32First(hSnap, &pe32))
        {
            if (strcmp(pe32.szExeFile,processName) == 0)
                return TRUE;
            while (PProcess32Next(hSnap, &pe32))
                if (strcmp(pe32.szExeFile,processName) == 0)
                    return TRUE;
        }
    }
    CloseHandle(hSnap);
    return FALSE;
}
DWORD WINAPI secondthread( LPVOID lpParam ) {
    while(isProcessRun("console1.exe")) {
     
    }
    exit(1);
}
Если надо более подробно обьяснить, то напиши в личку югейма, там проще будет.
 
already
Пользователь
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
373
Реакции[?]
42
Поинты[?]
0
Если надо более подробно обьяснить, то напиши в личку югейма, там проще будет.
Попробую для начала сам немного разобраться)
И за помощь - спасибо!
 
Пользователь
Статус
Оффлайн
Регистрация
17 Июл 2021
Сообщения
462
Реакции[?]
118
Поинты[?]
10K
Скрытое содержимое
Если ты хочешь, что бы у тебя при запуске console1 запускалось console2, и при закрытии console1, console2 закрывалась.
То смотри.
в console1 в мейн пихаешь код
C++:
system("start console2.exe");
в console2 создаёшь новый поток, и пихаешь туда это
C++:
bool isProcessRun(char *processName)
{
    HANDLE hSnap = NULL;
    PROCESSENTRY32 pe32;
    hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap!=NULL)
    {
        if (Process32First(hSnap, &pe32))
        {
            if (strcmp(pe32.szExeFile,processName) == 0)
                return TRUE;
            while (PProcess32Next(hSnap, &pe32))
                if (strcmp(pe32.szExeFile,processName) == 0)
                    return TRUE;
        }
    }
    CloseHandle(hSnap);
    return FALSE;
}
DWORD WINAPI secondthread( LPVOID lpParam ) {
    while(isProcessRun("console1.exe")) {
    
    }
    exit(1);
}
Если надо более подробно обьяснить, то напиши в личку югейма, там проще будет.
Это костыль.

Насколько я помню, если ты напрямую откроешь программу (без cmd), то твоя программа будет для нее родительской, а та дочерней. При закрытии родительской программы, все дочернии автоматически закрываются.
 
feel irl
Участник
Статус
Оффлайн
Регистрация
21 Дек 2018
Сообщения
677
Реакции[?]
294
Поинты[?]
16K
Это костыль.

Насколько я помню, если ты напрямую откроешь программу (без cmd), то твоя программа будет для нее родительской, а та дочерней. При закрытии родительской программы, все дочернии автоматически закрываются.
Ну тогда юзаем это как старт прогии всё....
C++:
TCHAR   cmd[] = L"console2.exe 123.txt";
CreateProcess(NULL, cmd,NULL, NULL, FALSE,0, NULL, NULL, &si, &pi);
 
IRQL_APC_LEVEL
Пользователь
Статус
Оффлайн
Регистрация
25 Авг 2018
Сообщения
211
Реакции[?]
88
Поинты[?]
3K
В общем, при запуске консоли, у меня запускается вторая консоль, лежащая с первой в одной папке
Код:
 system("start console2.exe");
Запуск второй консоли, при запуске первой - дело простое) Но как теперь закрывать вторую, при завершении первой - не понял)

edit:
Слишком мало знаю в ++, пойду гуглить дополнительно

edit2:
Конкретно как просто завершить второй, я знаю. Но как сделать проверку на работу первой - нет)
Вариантов много, например: повесить коллбек на закрытие своего процесса, создать пайп сокет, создать мутекс и проверять, а валиден ли он, второй прилке, после создания процесса, вызвать NtQueryInformationProcess, найти родителя, создать поток и в нем проверять GetExitCodeProcess.
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Но как сделать проверку на работу первой - нет
У каждого процесса есть идентификатор.
Создавай процесс через стандартный апи CreateProcess и сможешь знать его идентификатор, а лучше хэндл (потому что идентификаторы могут переиспользоваться).
В принципе можно создать отдельный поток, и ждать там по этому хэндлу бесконечно через WaitForSingleObject(), и затем завершаться, вполне реально сделать их взаимозависимыми.
 
Сверху Снизу