Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
 Аватар для Ihtiandr
1 / 1 / 0
Регистрация: 03.01.2011
Сообщений: 32

Завершение родительского процесса из дочернего

15.07.2011, 19:35. Показов 5221. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Мне нужно из дочернего процесса закрыть родительский, но ничего не выходит.
Вот исходник дочернего

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<windows.h>
#include<conio.h>
 
int main(int argc, char *argv[])
{
char c;
HANDLE hThread;
 
hThread =  (HANDLE)atoi(argv[1]);
 
while (true)
  {
   cputs("Input 't' to terminate the thread: ");
   c =_getch();
   if (c=='t')
     {
      cputs("t\n");
      break;
     }
    TerminateThread(hThread,0);
    CloseHandle(hThread);
    cputs("Pres any key to exit.\n");
    _getch();
    return 0;
  }
}

Вот родительского

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include<windows.h>
#include<conio.h>
volatile int count;
 
void thread()
{
for(;;)
{
count++;
Sleep(500);
cprintf("count= %d\n",count);
}
}
 
int main()
{
char lpszComLine[80];
STARTUPINFO si;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
 
HANDLE hThread;
DWORD IDThread;
 
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = True;
 
hThread = CreateThread(&sa,0,(LPTHREAD_START_ROUTINE)thread, NULL, 0, &IDThread);
 
if(hThread == NULL)
return GetLastError();
 
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
 
wsprintf(lpszComLine,"c:\\CP.exe %d",(int)hThread);
 
if(!CreateProcess(
NULL,
lpszComLine,
NULL,NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi))
{
cputs("The new process is't created");
_getch();
return GetLastError();
}
 
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
 
WaitForSingleObject(hThread,INFINITE);
        cputs("Press any key to exit");
        _getch();
CloseHandle(hThread);
return 0;
 
 
}
Когда запускаю родительский процесс он запускает дочерний а в дочернем при нажатии на "t" сам себя закрывает а родительский продолжает работать.
Помогите разобраться.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2011, 19:35
Ответы с готовыми решениями:

Ссылка на метод дочернего класса из родительского
Всем привет! Я новичок в C++. Помогите, пожалуйста, сослаться из родительского класса на метод, реализованный в дочернем классе, и,...

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого...

Запуск дочернего процесса
Почему второй вариант не запускает дочерний процесс? // Работает CreateProcess(L&quot;programma.exe&quot;, L&quot;programma.exe...

10
 Аватар для Aneron
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
15.07.2011, 19:53
код не читал.
способы.
1. некий флаг в родительском процессе который будет закрывать родительский. в дочерний процесс передаешь указатель на флаг.
2.злой способ. TerminateThread из дочернего процесса. для этого в дочерний нужно передать родительский хидер. убьешь родительский поток-сразу убьешь все дочерние.
0
 Аватар для Ihtiandr
1 / 1 / 0
Регистрация: 03.01.2011
Сообщений: 32
16.07.2011, 07:50  [ТС]
Aneron
посмотри код я уже воспользовался 2 способом, всё равно не работает.

Добавлено через 10 часов 1 минуту
Aneron
Я изменил родительский процесс используя DuplicateHandle
Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<windows.h>
#include<conio.h>
volatile int count;
 
void thread()
{
for(;;)
{
count++;
Sleep(500);
cprintf("count= %d\n",count);
}
}
 
int main()
{
char lpszComLine[80];
char lpszHandle[20];
STARTUPINFO si;
PROCESS_INFORMATION pi;
 
HANDLE hThread, hInheritThread;
DWORD IDThread;
 
 
 
hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread, NULL, 0, &IDThread);
wsprintf(lpszComLine,"c:\\CP.exe %d",(int)hThread);
 
if(!DuplicateHandle(GetCurrentProcess(),
hThread,
GetCurrentProcess(),&hInheritThread,
 0,TRUE,DUPLICATE_SAME_ACCESS))
 
ZeroMemory(&si,sizeof(STARTUPINFO));
 si.cb = sizeof(STARTUPINFO);
 itoa((int)hInheritThread,lpszHandle,10);
 strcat(lpszComLine,lpszHandle);
 
if(!CreateProcess(
NULL,
lpszComLine,
NULL,NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi))
 
{
cputs("The new process is't created");
_getch();
return GetLastError();
}
 
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
_getch();
 
CloseHandle(hThread);
return 0;
 
}
Теперь у меня при запуске родительского процесса дочернимй вообще не выходит а монитор становится красным и выходит ошибка"Ошибка при инициализации приложения 0хс0000005" при нажатии на "Ок" родительский процесс не завершается а продолжается.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
16.07.2011, 08:01
Цитата Сообщение от Aneron Посмотреть сообщение
убьешь родительский поток-сразу убьешь все дочерние.
как так? Я постоянно убиваю родительские, а дочерние живы. Правда, убиваю вручную, а не программно, но тем не менее.
0
 Аватар для Ihtiandr
1 / 1 / 0
Регистрация: 03.01.2011
Сообщений: 32
16.07.2011, 08:09  [ТС]
kravam
Так проблема в том что мой дочерний не убивает родительский. А только самого себя.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
16.07.2011, 11:30
Тут я разбирался с этим вопросом
https://www.cyberforum.ru/cpp-... post308808

Добавлено через 3 часа 6 минут
Тут фишка в том ещё, что допустим ты нашёл хидер родительского процесса и посылаешь ему TerminateProcess, а он не закрывается, потому, что каких-то прав нет.

Windows NT/2000/XP: дескриптор должен иметь право доступа PROCESS_TERMINATE. Для получения дополнительной информации, см. статью Защита процесса и права доступа.
0
16.07.2011, 20:22

Не по теме:

Цитата Сообщение от Ihtiandr Посмотреть сообщение
вообще не выходит а монитор становится красным
Ему стыдно...

1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
17.07.2011, 19:42
Мне кажется, по изучении этой темы ты без труда убьёшь родительский процесс из дочернего
Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему?
0
 Аватар для Ihtiandr
1 / 1 / 0
Регистрация: 03.01.2011
Сообщений: 32
18.07.2011, 12:30  [ТС]
kravam
Вот я изменил дочерний всё зароботало
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#pragma argsused
#include<windows.h>
#include<conio.h>
 
int main(int argc, char *argv[])
{
char c;
HANDLE hThread;
 
hThread =  (HANDLE)atoi(argv[1]);
 
 
while (true)
  {
   cputs("Input 't' to terminate the thread: ");
   c =_getch();
 
   if (c=='t')
 
     {
      cputs("t\n");
      TerminateThread(hThread,0);
      _getch();
      break;
     }
 
    TerminateThread(hThread,0);
    CloseHandle(hThread);
    cputs("Pres any key to exit.\n");
    _getch();
 
  }
}
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
18.07.2011, 15:36
Дай код родительского процесса
0
 Аватар для Ihtiandr
1 / 1 / 0
Регистрация: 03.01.2011
Сообщений: 32
24.07.2011, 19:26  [ТС]
kravam
смотри моё первое сообщение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2011, 19:26
Помогаю со студенческими работами здесь

Почему в списке инициализации конструктора дочернего класса нельзя вызывать конструктор родительского через его пространство имён?
Есть класс D и от него порождён класс Wd Тут вот например всё работает корректно (использую обращение ч/з пространство имён класса...

Завершение дочернего процесса
Подскажите как правильно обработать завершение программы при вызове родителем QProcess::close() Надо во вторичных потоках завершить...

Завершение дочернего процесса по ошибке
Например, я запускаю дочерний процесс 1.ехе и ожидаю его окончания: #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace...

Корректное завершение дочернего процесса
Я тестирую оконную программу - открываю и закрываю её несколько раз. Иногда программа завершается с ошибкой. Мне надоело запускать и...

Завершение родительского процесса раньше порожденного
Здравствуйте. Есть задачка, в которой процесс порождает новый процесс. При этом родительский должен завершиться раньше дочернего. У меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru