С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661

Что будет,если закрыть хэндл с открытым процессом,потоком? Или это только информация?

08.07.2017, 00:20. Показов 3063. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что будет,если закрыть хэндл с открытым процессом,потоком? Или это только информация?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2017, 00:20
Ответы с готовыми решениями:

Что будет, если на одной стороне закрыть сокет, а на другой - нет?
Что будет, если на одной стороне закрыть сокет, а на другой - нет? Будет ли он занимать какую-либо память/порты/etc?

Как информация может передаваться свойству Console.Out если это свойство только для чтения
Господа, подскажите пожалуйста, читаю Шилдта и запутался в определенном моменте "В частности, свойство Console.Out связано со...

Скрипт работает только если у .htaccess права 666, будет ли безопасно это?
{ $ip = "deny from ".$_SERVER."\r\n"; $fp = @fopen(".htaccess", "a+"); fwrite($fp, $ip); fclose($fp); } Скрипт работает...

26
08.07.2017, 00:30

Не по теме:

Это всё тлен.

0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
08.07.2017, 01:11  [ТС]
daun-autist, ? Ну,ок. Т.е просто информация?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
08.07.2017, 09:00
Лучший ответ Сообщение было отмечено Nick Alte как решение

Решение

Цитата Сообщение от NewNoob Посмотреть сообщение
Что будет,если закрыть хэндл с открытым процессом,потоком?
Процессу или потоку ничего не будет.
Хэндл - это аналог ссылки на объект. Нет хэндла - нет ссылки, на объект теперь нечем ссылаться.
При этом сам объект продолжает жить, пока не будет завершен.
3
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
08.07.2017, 17:20  [ТС]
Убежденный, понял. А вот написано было,что фу-ей TerminateProcess,Thread поток/процесс закрываются,но ресурсы не освобождаются. Как их освободить или какие вместо этих ф-й исользовать?

Добавлено через 2 часа 18 минут
Убежденный, что даёт,кстати,наследование дескрипторов?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
09.07.2017, 21:11
Цитата Сообщение от NewNoob Посмотреть сообщение
А вот написано было,что фу-ей TerminateProcess,Thread поток/процесс закрываются,но ресурсы не освобождаются. Как их освободить или какие вместо этих ф-й исользовать?
TerminateThread/Process - это уничтожение (т.е. завершение) потока/процесса.
А CloseHandle - это закрытие хэндла, который указывает на соответствующий объект.
Улавливаешь разницу?

Цитата Сообщение от NewNoob Посмотреть сообщение
что даёт,кстати,наследование дескрипторов?
Можно передавать хэндлы из одного процесса в другой (дочерний).
1
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
11.07.2017, 15:14  [ТС]
Убежденный, что,кстати,это ещё такое,т.е как можно строку перевести в число,если там нет числа,и как это связано с дескриптором,т.е имя в числовом виде - дескриптор?:
C++
1
2
3
4
5
6
7
8
9
#include <windows.h>
#include <conio.h>
int main(int argc, char *argv[])
{
HANDLE hThread;
char c;
// преобразуем символьное представление дескриптора в число
hThread = (HANDLE)atoi(argv[1]);
// ждем команды о завершении потока
Добавлено через 17 минут
Только что-то она не закрывает поток

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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <string.h>
 
#define get_pause() cout << "Press any key to quit..." << endl; getch()
 
using namespace std;
 
int main(int argc,char* argv[])
{
    for (int i = 0; i < argc; i++)
    {
        cout << argv[i] << ": " << i << endl;
    }
 
    HANDLE hThread = (HANDLE)atoi(argv[0]);
 
    char c;
 
    for (;;)
    {
        cin >> c;
 
        if (c == 'e')
        {
            TerminateThread(hThread, 0);
            CloseHandle(hThread);
            break;
        }
    }
 
    for (int i = 0; i < 10; i++)
    {
        cout << i << endl;
    }
 
    get_pause();
    return 0;
}
Добавлено через 11 минут
Убежденный, что,кстати такое - STARTUPINFO.cb

Добавлено через 1 минуту
и SECURITY_ATTRIBUTES.lpSecurityDescriptor
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.07.2017, 16:04
Цитата Сообщение от NewNoob Посмотреть сообщение
что,кстати,это ещё такое,т.е как можно строку перевести в число,если там нет числа
Ничего не понял.

Цитата Сообщение от NewNoob Посмотреть сообщение
и как это связано с дескриптором,т.е имя в числовом виде - дескриптор?
Тоже вопрос не понятен.

Цитата Сообщение от NewNoob Посмотреть сообщение
Только что-то она не закрывает поток
В argv[0] обычно передается путь к исполняемому файлу.
Довольно странно использовать этот путь как аргумент для atoi...
И, кстати, где проверка ошибок?
И, между прочим, HANDLE нельзя приводить к int и обратно, на x64 у них размеры разные.

Цитата Сообщение от NewNoob Посмотреть сообщение
что,кстати такое - STARTUPINFO.cb
Цитата Сообщение от NewNoob Посмотреть сообщение
SECURITY_ATTRIBUTES.lpSecurityDescriptor
См. в MSDN, там все написано, дублировать здесь не вижу смысла.
1
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
11.07.2017, 16:53  [ТС]
Убежденный, ну я и сам удивился. В книге пример. Вот он:
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
#include <windows.h>
#include <conio.h>
int main(int argc, char *argv[])
{
HANDLE hThread;
char c;
// преобразуем символьное представление дескриптора в число
hThread = (HANDLE)atoi(argv[1]);
// ждем команды о завершении потока
while (true)
{
_cputs("Input 't' to terminate the thread: ");
c = _getch();
if (c == 't')
{
_cputs("t\n");
break;
}
Ãëàâà 4. Ïðîöåññû â Windows 69
}
// завершаем поток
TerminateThread(hThread, 0);
// закрываем дескриптор потока
CloseHandle(hThread);
_cputs("Press any key to exit.\n");
_getch();
return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.07.2017, 17:30
Windows 69
Наверное, ну очень старая книга

Кстати, в этом примере argv[1] берется, а в твоем коде argv[0]...
1
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
11.07.2017, 20:46  [ТС]
Убежденный, а какие сейчас актуальны книги? У меня нет аргв 1. Это одна из книг,что вы советовали
0
440 / 432 / 159
Регистрация: 21.05.2016
Сообщений: 1,338
12.07.2017, 01:25
Цитата Сообщение от NewNoob Посмотреть сообщение
Убежденный, а какие сейчас актуальны книги? У меня нет аргв 1. Это одна из книг,что вы советовали
В argv[0] название программы. Первый аргумент записывается в argv[1]
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
12.07.2017, 15:20  [ТС]
oldnewyear, у меня просто путь
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
12.07.2017, 15:25
NewNoob, он самый и должен быть.
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
13.07.2017, 03:28  [ТС]
Убежденный, кстати,вопрос. Если я передаю хэндл дочернему процессу,т.е получается он один и тот же будет у обоих процессов? И я смогу в другом процессе сразу родительский закрыть? Или какая у этого цель? Кстати,а также у дублирования хэндла

Добавлено через 2 минуты
Убежденный, кстати,а практической книжки достаточно будет,чтобы научиться системному программированию? Или ещё стоит теор.почитать,вроде таненбаума.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.07.2017, 09:34
Цитата Сообщение от NewNoob Посмотреть сообщение
Если я передаю хэндл дочернему процессу,т.е получается он один и тот же будет у обоих процессов? И я смогу в другом процессе сразу родительский закрыть? Или какая у этого цель? Кстати,а также у дублирования хэндла
Нельзя просто взять и передать хэндл из одного процесса в другой. Хэндлы валидны только в
контексте процесса, где они были открыты. Например, у процесса А.exe хэндл 0xF4 может
указывать на файл, а у процесса B.exe этот же хэндл 0xF4 указывает на какой-нибудь
другой объект. Или вообще не валиден.

Сделать дубликат хэндла в другой процесс можно двумя (как минимум) способами.

1. Использовать SECURITY_ATTRIBUTES и ее параметр bInheritHandle.

Наверное, ты обращал внимание, что у большинства функций для создания объектов (файлы, процессы,
ключи реестра, евенты, мьютексы и т.д.) есть дополнительный аргумент, принимающий указатель на
структуру SECURITY_ATTRIBUTES. Так вот, если задать там bInheritHandle = TRUE, то хэндл станет
наследуемым. Если позже ты создаешь дочерний процесс и в CreateProcess указываешь
bInheritHandles = TRUE, то все наследуемые хэндлы копируются в дочерний процесс. При этом числовые
значения хэндлов остаются теми же самыми. То есть, например, родительский процесс и дочерний
процесс могут работать с одним и тем же файлом Book.txt через один и тот же хэндл 0xE840.

2. Использовать функцию DuplicateHandle.

Здесь требуется, чтобы дочерний процесс уже был запущен (нужен его хэндл).
И числовые значения хэндлов в обоих процессах будут уже отличаться (хотя они по-прежнему
будут указывать на один и тот же объект).

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

Кстати, дублировать можно не все хэндлы, а только те, которые являются "настоящими" (IFS), а
не псевдо-хэндлами или чем-то другим. Например, нельзя сделать дубликат из GetCurrentProcess().
Для access token вместо DuplicateHandle следует использовать DuplicateToken(Ex).
Для сокетных хэндлов рекомендуется применять WSADuplicateSocket (потому что они не всегда
"настоящие"). И т.д.

Цитата Сообщение от NewNoob Посмотреть сообщение
а практической книжки достаточно будет,чтобы научиться системному программированию? Или ещё стоит теор.почитать,вроде таненбаума.
Нет такой книжки. Нужно читать много, очень много.
И не только книжки, но еще и MSDN, различные исходники, а также самому много
думать, анализировать и тренироваться.
2
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
23.07.2017, 14:05  [ТС]
Убежденный, помогите разобраться в коде. Там критические секции добавились,ошибку выдаёт. Критическая секция - типа только к один поток доступ к ресурсам получает,а остальные не могут? Т.е,когда я в неё вхожу,та часть кода становится критической секцией?

Про сам код забыл...................

Добавлено через 16 часов 19 минут
Убежденный,
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
66
67
68
69
70
71
72
73
74
#include <conio.h>
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
 
#define get_pause() cout << "Press any key to quit..." << endl; _getch()
 
using namespace std;
 
CRITICAL_SECTION cs;
 
DWORD WINAPI thread_f(LPVOID)
{
    int i;
    int j;
 
    for (j = 0; j < 10; j++)
    {
        EnterCriticalSection(&cs);
 
        for (i = 0; i < 10; i++)
        {
            cout << j << " " << flush;
            Sleep(17);
        }
 
        LeaveCriticalSection(&cs);
 
        cout << endl;
 
        return 0;
    }
}
 
int main()
{
    int i;
    int j;
 
    HANDLE hThread;
    DWORD IDThread;
 
    hThread = CreateThread(NULL, 0, thread_f, NULL, 0, &IDThread);
 
    if (!hThread)
    {
        cout << "Error " << endl;
        get_pause();
        return GetLastError();
    }
 
    for (j = 0; j < 10; j++)
    {
 
        EnterCriticalSection(&cs);
 
        for (i = 0; i < 10; i++)
        {
            cout << j << flush;
            Sleep(17);
        }
 
    }
 
    LeaveCriticalSection(&cs);
 
    cout << endl;
 
    WaitForSingleObject(hThread,INFINITE);
 
    get_pause();
    return 0;
}
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
23.07.2017, 16:58
NewNoob, строку 66 перемести на строку 63.
0
6 / 10 / 2
Регистрация: 29.05.2015
Сообщений: 661
24.07.2017, 00:44  [ТС]
schdub, мне суть сначала понять нужно. Я равильно понял суть этого?

Добавлено через 4 часа 46 минут
schdub, кстати,все ранво ошибка
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
24.07.2017, 09:30
Цитата Сообщение от NewNoob Посмотреть сообщение
кстати,все ранво ошибка
какая ошибка? ошибка компиляции? ошибка времени выполнения? какой у нее текст?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.07.2017, 09:30
Помогаю со студенческими работами здесь

Узнать вероятность что при выборе одной из подмножеств , это подмножество будет содержать только нечетные числа
1) Узнать вероятность что при выборе одной из подмножеств где нету ноля из множества A={0,1,2,3,4,5,6}, это подмножество будет содержать...

Как прочитать лог-файл, если в это время он занят другим процессом
Здравствуйте. Пытаюсь делать Лог-файл и посчитать количество строк в файле. Вылетат ошибка мол этот документ используется ( .. В чем может...

Что будет, если за источником установить светофильтр, желтый или зеленый
Возникает интересный вопрос. Пусть есть источник света, например гелиевая лампа, на его пути помещаем поляризатор , затем анализатор и...

Выполнение определенной команды отдельным процессом и потоком
Подскажите пожалуйста как задать выполнение определенной команды отдельным процессом и потоком????? СПАСИБО!!!!

Быстро загружается ЦП и память компьютера (на 90+ %). Спасает только перезагрузка. Это вирус или что?
Здравствуйте. У меня следующая проблема. После 30-40 минут работы компьютер начинает повисать, при вызове диспетчера показывает, что ЦП...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru