Перейти к содержимому

Как завершить процесс c

  • автор:

Завершение программы 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++

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *