Завершение программы C++
Функция, объявленная exit в , завершает программу C++. Значение, предоставленное в качестве аргумента exit , возвращается операционной системе в качестве возвращаемого кода программы или кода выхода. Принято, чтобы нулевым кодом возврата обозначалось, что программа завершена успешно. Константы EXIT_FAILURE можно использовать, а EXIT_SUCCESS также определенные в , чтобы указать успешность или сбой программы.
Функция abort
Функция abort , объявленная в стандартном формате, включает , завершает программу C++. Разница между exit и abort заключается в том, что exit обработка завершения среды выполнения C++ выполняется (вызывается глобальные деструкторы объектов). abort немедленно завершает программу. Функция abort проходит обычный процесс уничтожения для инициализированных глобальных статических объектов. Также осуществляется обход всей специальной обработки, которая была задана с помощью функции atexit .
Корпорация Майкрософт: по соображениям совместимости Windows реализация abort microsoft может разрешить выполнение кода завершения библиотеки DLL в определенных обстоятельствах. Дополнительные сведения см. в разделе abort .
Функция atexit
Используйте функцию atexit , чтобы указать действия, выполняемые до завершения программы. Перед выполнением функции выхода не инициализированы глобальные статические объекты, инициализированные перед вызовом atexit .
return оператор in main
Инструкция return позволяет указать возвращаемое значение из main . Оператор return в main первую очередь действует как любая другая return инструкция. Все автоматические переменные уничтожаются. main Затем вызывает возвращаемое exit значение в качестве параметра. Рассмотрим следующий пример:
// return_statement.cpp #include struct S < int value; >; int main() < S s< 3 >; exit( 3 ); // or return 3; >
return Операторы exit , описанные в предыдущем примере, имеют аналогичное поведение. Как завершить программу, так и вернуть значение 3 операционной системе. Разница заключается в том, что exit не уничтожает автоматическую переменную s , а return оператор делает.
Как правило, C++ требует, чтобы функции, имеющие возвращаемые типы, отличные от void возвращаемого значения. Функция является исключением. Она main может завершиться без инструкции return . В этом случае он возвращает значение, зависящее от реализации, в вызывающий процесс. (По умолчанию MSVC возвращает значение 0.)
Уничтожение потоков и статических объектов
При вызове exit напрямую (или при вызове после оператора из main ), объекты потоков, связанные с текущим потоком return , уничтожаются. Затем статические объекты уничтожаются в обратном порядке их инициализации (после вызовов функций, указанных в , если таковые имеются atexit ). В следующем примере показано выполнение такого процесса инициализации и удаления.
Пример
В следующем примере статические объекты sd1 создаются и sd2 инициализированы перед записью main . После завершения работы этой программы с помощью инструкции return сначала sd2 уничтожается, а затем sd1 . Деструктор класса ShowData закрывает файлы, связанные с этими статическими объектами.
// using_exit_or_return1.cpp #include class ShowData < public: // Constructor opens a file. ShowData( const char *szDev ) < errno_t err; err = fopen_s(&OutputDev, szDev, "w" ); >// Destructor closes the file. ~ShowData() < fclose( OutputDev ); >// Disp function shows a string on the output device. void Disp( char *szData ) < fputs( szData, OutputDev ); >private: FILE *OutputDev; >; // Define a static object of type ShowData. The output device // selected is "CON" -- the standard output device. ShowData sd1 = "CON"; // Define another static object of type ShowData. The output // is directed to a file called "HELLO.DAT" ShowData sd2 = "hello.dat"; int main()
Другой способ написания этого кода заключается в объявлении ShowData объектов с блоком область, который неявно уничтожает их при выходе из область:
Принудительное завершение дочернего процесса из родителя в fork() в си
Возможно ли завершить дочерний процесс не дожидаясь его окончания с помощью функции wait() ? Например, как завершить вот такой дочерний процесс:
pid_t pid; switch(pid=fork()) < case 0: for(;;)<>default: //здесь код, который завершает дочерний процесс return 0;
P.S. Если вы знаете какой-то адекватный, не сильно мудреный материал по fork() , где можно почерпнуть теоретические знания, то направьте меня, пжл.
Отслеживать
user194374
задан 3 дек 2016 в 10:43
407 4 4 серебряных знака 17 17 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
kill(pid, SIGKILL);
Или более мягко:
kill(pid, SIGTERM);
В первом случае дочерний процесс будет просто убит, во втором получит сигнал, который может обработать. Но SIGKILL убъёт процесс гарантированно, а в случае SIGTERM процесс может отказаться заканчивать работу.
В приведённом коде, поскольку процесс, похоже, не содержит обработчиков сигналов, можно использовать любой метод, поскольку, как верно указал на мою ошибку @avp, SIGTERM при отсутствии обработчика также убьёт процесс.
Запуск/завершение процесса (программы) из C/C++

В начале, нужно объявить необходимые переменные:
TCHAR szPath[] = TEXT("info.exe"); // Путь к файлу // Необходимые для запуска процесса структуры STARTUPINFO si; PROCESS_INFORMATION pi;
Такой код запускает процесс (программу):
memset(&si, 0, sizeof(si)); si.cb = sizeof(si); memset(&pi, 0, sizeof(pi)); CreateProcess(NULL, szPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
Следующий код завершает выполнение процесса (программы), запущенного приведенным выше кодом:
TerminateProcess(pi.hProcess, 0); CloseHandle(pi.hProcess); CloseHandle(pi.hThread);
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей .
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Свежие комментарии
- tedig к записи Получение стакана из QUIK в QLua(Lua)
- inik к записи Пример работы с файлами в QLua (Lua)
- Stas к записи Нужные функции
- MarXYN к записи Индикатор экстремум
- achat к записи Вопрос-ответ
- Nikitos к записи Вопрос-ответ
- kimser к записи Индикатор экстремум
- TGB к записи Модуль сереализации/десереализации и печати таблиц Lua
- kodges к записи Взаимодействие Lua и библиотеки DLL, написанной на C/C++
- ПавелИ к записи Обмен данными между DLL (C/C++) и приложением C#
Завершение процесса из командной строки

Как должно быть Вам известно, процесс можно запросто завершить, выбрав соответствующий пункт в диспетчере задач. Однако, так же есть возможность завершения нужного процесса через командную строку, с помощью программы taskkill, которая идет по умолчанию с любой операционной системой Windows. Рассмотрим различные примеры применения этой программы.
Завершение процесса по его имени
Данный вариант идеально подходит для ситуаций, когда нужно завершить процесс или группу процессов с одинаковым именем. Делается это следующей командой:
taskkill /IM _ИМЯ_ПРОЦЕССА_ /F
где _ИМЯ_ПРОЦЕССА_ — это имя процесса, например calc.exe. То есть, для завершения процесса программы «Калькулятор», нужно выполнить следующую команду:
taskkill /IM calc.exe /F
Флаг /F указывает немедленное завершение указанного процесса
Завершение процесса по его PID

Еще процесс можно завершить по его идентификатору в системе — удобно, в том случае, если Вам нужно завершить какой-то определенный процесс, имя которого, к примеру, совпадает с именами других процессов. Получить PID можно выполнив команду tasklist : Найдя нужный процесс и его PID, можно перейти к его завершению. Делается это так:
taskkill /PID _PID_ /F
где вместо _PID_ должен быть настоящий PID процесса.
Расширенные условия фильтрации процессов
- CPUTIME — время CPU
- IMAGENAME — имя образа
- MEMUSAGE — использование памяти в Кбайтах
- MODULES — имя DLL
- PID — значение
- SERVICES — имя службы
- SESSION — номер сессии
- STATUS — статус
- USERNAME — имя пользователя
- WINDOWTITLE — заголовок окна
Так же программа умеет работать со следующими операторами сравнения:
Разберем на примерах. Например, нужно закрыть процесс iexplore (наименование процесса браузера Internet Explorer) у пользователя Ivan:
taskkill /FI "USERNAME eq Ivan" /IM iexplore.exe /F
Завершим все процессы пользователя Ivan:
taskkill /FI "USERNAME eq Ivan" /F
Работа с другим компьютером
Программа taskkill так же умеет работать с другим компьютером — для этого используются три следующих флага:
- /S — имя или адрес удаленного компьютера
- /U — имя пользователя
- /P — пароль пользователя
К примеру, если нужно на компьютере с адресом 192.168.100.1 «убить» процесс notepad.exe, то нужно выполнить следующую команду:
taskkill /S 192.168.100.1 /U user /P 12345678 /IM notepad.exe /F
Где, как должно быть понятно 192.168.100.1 — адрес компьютера, user — имя пользователя, 12345678 — пароль.
Если эти действия нужно сделать с компьютером, который находится в одном домене с Вашим текущим пользователем, и он обладает правами администратора (например, он администратор домена), то можно выполнить выше указанную команду без указания конкретного пользователя:
taskkill /S 192.168.100.1 /IM notepad.exe /F