Я пишу код на языке Си, в котором анализирую некоторые данные. Я настроил программу на обработку только 100 входных данных. Когда он имеет более 100 входных данных, он выдает ошибку сегментации. Я хочу создать способ, при котором, когда количество входных данных превысит 100, пользователь будет предупрежден, и программа завершится. Я знаю, как сделать это из функции main простым return 0 способом, однако я нахожусь на расстоянии нескольких вызовов функций от main, и это трудно сделать, даже если a return 0 в этой функции будет поддерживать цикл.
Есть ли какой-нибудь немедленный способ завершить всю программу, не находясь в main?
Ответ №1:
Стандартная функция exit — это то, что вы ищете:
Завершает процесс в обычном режиме, выполняя регулярную очистку для завершения процессов.
Во-первых, все функции, зарегистрированные вызовами atexit, выполняются в порядке, обратном их регистрации. Затем все потоки закрываются, а временные файлы удаляются, и, наконец, управление возвращается в среду хоста.
Как закрыть все программы на Windows в один клик?
Аргумент status возвращается в среду хоста.
Было бы лучше, если бы вы исправили ошибку segfault.
1. Рассмотрим разницу между exit() и abort() — обработка atexit() .
Ответ №2:
Вам нужно включить стандартную библиотеку, а затем вы можете вызвать exit, где захотите:
#include . exit(status);
где status — это целое число, представляющее код выхода.
Что касается статуса проблемы: для соглашения 0 — это успех, другие значения указывают на состояние ошибки.
1. Стандарт предоставляет константы EXIT_SUCCESS и EXIT_FAILURE . Были машины, на которых любое четное число считалось успешным, в то время как нечетные значения были неудачными.
Ответ №3:
Вы также можете fprintf(stderr, . ) , а затем вызвать abort() ; это может быть полезно, если вы хотите позже отладить свою ошибку.
Но я считаю, что вам следует перекодировать свою программу так, чтобы ограничения по размеру определялись только доступными ресурсами: поэтому, если вы запускаете свою программу на гораздо большем компьютере (что бы это ни значило), она может обрабатывать более 100 входных данных.
Ответ №4:
Немного лучше было бы перехватить ошибку сегментации с помощью обработчика сигналов и заставить обработчик сигналов вызвать сигнал SIGSTOP.
Таким образом, ваша программа останавливается, но остается в памяти. Затем вы можете подключиться к ней с помощью отладчика и увидеть программу во всей ее красе, застывшую на месте в момент, когда произошел сбой SEGFAULT.
Это может быть полезно для поиска проблем в давно запущенных программах, которые вы не запускаете в среде разработки.
Источник: programbox.ru
Как закрыть программу, если она зависла и не закрывается
Как немедленно закрыть аварийное приложение?
У меня есть приложение, которое иногда вызывает исключения. И мне нужно перезапустить его, если он разбился. Но проблема в том, что у меня здесь Windows 7, и когда приложение вылетает, Windows показывает мне красивое диалоговое окно с предложением закрыть приложение. Но само приложение все еще работает, пока я не нажму «Закрыть». Как избавиться от этого окна и немедленно завершить работу приложения без каких-либо диалоговых окон?
Еще одно полезное решение — настройка реестра HKEY_CURRENT_USERControl PanelDesktop сделайте запись REG_SZ с именем AutoEndTasks и установите его на 1 — jaggedsoft
Тогда возникает вопрос: как немедленно завершить работу конкретного (Process Id) отказавшего приложения? — guan boshen
3 ответы
В идеале вы должны улавливать все исключения в самой внешней области вашей программы. Однако иногда у вас нет возможности внести такие изменения, и диалоговые окна сбоя не позволяют вам восстановиться после сбоя. В этих случаях вы можете отключить Отчеты об ошибках Windows, либо целиком, либо для конкретной программы.
В Windows 7: Пуск Orb -> Панель управления -> Центр действий -> Обслуживание -> Проверить решения для отчетов о проблемах -> Настройки.
Обновление: чтобы полностью отключить пользовательский интерфейс отчетов об ошибках, измените DontShowUI параметр реестра:
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows Отчет об ошибках Windows DontShowUI
ответ дан 25 дек ’10, 20:12
Вылетает не мое приложение. И эта отчетность отключена. Но Windows по-прежнему показывает диалоговое окно, которое предотвращает завершение сбоя исполняемого файла до тех пор, пока вы не нажмете ОК. — Владислав Раструсный
Обновлен ответ, чтобы включить параметр реестра. — Рик Слэдки
У меня также есть приложение, которое мне не принадлежит, которое несколько раз дает сбой. Я хотел бы убедиться, что при сбое он автоматически завершается немедленно, не требуя от пользователя нажатия кнопки в окне уведомления. — Мэтт Коннолли
Чтобы отключить отчет об ошибках, установите DontShowUI в DWORD 0 — зазубренный
Вы можете использовать концепцию Dr Watson для обнаружения сбоя и перезапуска приложения. Используйте следующее:
Установите таймер, например:
SetTimer( eIsDwwin, 30000, NULL);
Это будет проверять процесс Dr Watson каждые 30 секунд в системном процессе, используя следующее:
void CMainFrame::OnTimer(UINT nIDEvent) < case eIsDwwin: HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); DWORD dwsma = GetLastError(); DWORD dwExitCode = 0; PROCESSENTRY32 procEntry=; procEntry.dwSize = sizeof( PROCESSENTRY32 ); Process32First(hndl, do < if(((!strcmpi(procEntry.szExeFile,»dwwin.exe»))|| (!strcmpi(procEntry.szExeFile,»drwatson.exe»))|| (!strcmpi(procEntry.szExeFile,»drwtsn32.exe»))|| (!strcmpi(procEntry.szExeFile,»WerFault.exe»))) (procEntry.th32ParentProcessID == GetCurrentProcessId())) < WSACleanup(); PostMessage( WM_CLOSE); Sleep(500); if(0==strcmpi(procEntry.szExeFile,»dwwin.exe»)) < system(«TASKKILL /IM dwwin.exe /F»); >else if(0==strcmpi(procEntry.szExeFile,»drwatson.exe»)) < system(«TASKKILL /IM drwatson.exe /F»); >else if(0==strcmpi(procEntry.szExeFile,»drwtsn32.exe»)) < system(«TASKKILL /IM drwtsn32.exe /F»); >else if(0==strcmpi(procEntry.szExeFile,»WerFault.exe»)) < system(«TASKKILL /IM WerFault.exe /F»); >else < system(«TASKKILL /IM WerFault.exe /F»); >break; > > while(Process32Next(hndl, CloseHandle(hndl); break; > >
Это изящно закроет приложение, в котором произошел сбой.
Другой способ — использовать Signal API в Windows для обработки исключений и сбоев.
Незнание языка вашего приложения немного усложняет задачу, но обычно вы можете справиться с этим, запустив приложение в эквиваленте блока try / catch (как в C #, C ++ или Python). В псевдо-Csharp-ish-коде:
bool done = false; main() < while( !done ) < AppClass aclass = new AppClass(); try < aclass->Run(); > catch( Exception x ) < LogErrorSomehow(x); delete aclass; continue; >> >
По сути, лучший способ обойти ошибку «необработанного исключения» — это обработать исключение, перехватив его и предприняв соответствующее действие (даже если это действие ничего не делает).
В этом примере, если кто-то хочет закрыть ваше приложение, вы должны установить значение «готово» на true и вернуться из Run ().
ответ дан 24 дек ’10, 23:12
Источник: stackovergo.com
Как принудительно закрыть приложения в Windows
Когда приложение на вашем ПК с Windows перестает отвечать, остается только одно: вам нужно принудительно закрыть его. В Windows есть несколько способов, позволяющих это сделать. Если запущенное программное обеспечение дает сбой и не закрывается, Windows может решить проблему сама, предоставляя вам безопасную возможность закрыть или перезапустить приложение.
Если вы хотите узнать, как принудительно завершить работу в Windows, особенно для приложений, которые не закрываются автоматически, вам необходимо выполнить следующие действия.
Подождите, пока Windows завершит работу неотвечающего приложения
Когда приложение перестает отвечать в Windows 10, подождите несколько секунд. Если приложение действительно не отвечает, Windows автоматически отвечает, давая приложению возможность восстановиться. Вы заметите, что в заголовке окна приложения появляется неотвечающий тег, который указывает на то, что Windows начинает обратный отсчет для завершения работы приложения.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
У Windows нет установленного времени для этого, но обычно она пытается решить проблему с запущенным приложением в течение нескольких секунд. Это может означать автоматическое закрытие приложения (в случае полного сбоя приложения) или, если на ответ требуется больше времени или есть шанс, что приложение может восстановиться, Windows позволит вам решить, что делать дальше.
Это включает в себя возможность принудительно закрыть и перезапустить приложение, закрыть его и оставить закрытым или дать приложению больше времени для восстановления. Вы можете решить сделать последнее, если приложение использует много системной памяти и вы уверены, что через несколько секунд оно восстановится.
После того, как вы сделали свой выбор, Windows должна довести его до конца. Однако, если вы решили принудительно закрыть приложение в Windows, но оно по-прежнему не отвечает, вам необходимо принять более решительные меры (например, перечисленные ниже).
Используйте свою клавиатуру
Прежде чем спешить с принудительным завершением работы приложения с помощью других методов, например, через диспетчер задач, вы можете попробовать свою клавиатуру. В Windows давно есть сочетания клавиш, которые помогают быстро выполнять системные задачи, например закрывать запущенную программу.
Вы можете попробовать сочетание клавиш Alt + F4. Комбинация клавиш Alt и F4 дает указание Windows попытаться закрыть текущее активное окно. Если вы используете эту команду клавиатуры, а приложение по-прежнему не отвечает, меры, перечисленные в разделе выше, должны активироваться, давая вам возможность перезапустить, принудительно выйти или дать больше времени.
Однако сочетание клавиш Alt-F4 не подходит для приложений, которые на самом деле не отвечают. В этом случае вам нужно будет попробовать другой метод.
Принудительный выход из приложения с помощью диспетчера задач
Каждая программа, приложение или системная служба, запущенная на вашем ПК с Windows, появится в диспетчере задач Windows. Вы можете просматривать использование системных ресурсов для каждой запущенной программы, помогая устранять неполадки в приложениях, которые не отвечают.
Например, если приложение достигает 100% загрузки ЦП, это означает, что оно, вероятно, работает слишком тяжело для оборудования вашего ПК. К счастью, диспетчер задач предназначен не только для информации. Вы можете использовать его для принудительного закрытия приложений, которые не отвечают.
- Для этого щелкните правой кнопкой мыши панель задач и выберите параметр Диспетчер задач.
- В окне диспетчера задач найдите приложение, которое вы хотите принудительно закрыть. Щелкните его правой кнопкой мыши, затем выберите «Завершить задачу», чтобы принудительно завершить работу. Приложение должно быть немедленно закрыто, но если этого не произошло, повторите процесс еще раз.
Принудительный выход из приложения с помощью терминала Powershell
Диспетчер задач — лучший способ заставить ошибочное приложение завершить работу, когда оно полностью перестает отвечать, но есть альтернативы. Если вы знакомы с терминалом Windows PowerShell, вы можете использовать его для принудительного выхода из приложений в Windows с помощью команды taskkill. Вы также можете использовать старую командную строку Windows для запуска этой команды, если хотите.
- Чтобы открыть терминал PowerShell, щелкните правой кнопкой мыши меню «Пуск» и выберите параметр Windows PowerShell (Admin).
- В окне терминала PowerShell введите список задач, чтобы просмотреть список всех запущенных процессов. Вам нужно будет найти приложение, сопоставив его с именем исполняемого файла (например, yourphone.exe или conhost.exe).
- Найдя имя приложения, введите taskkill / im process.exe, заменив process.exe на имя исполняемого файла приложения, которое вы хотите принудительно завершить (например, taskkill / im notepad.exe).
- Команда taskkill должна успешно заставить приложение завершить работу (за исключением некоторых защищенных служб Windows). Если это так, в окне терминала должно появиться сообщение об успешном выполнении. В противном случае вам нужно будет повторить процесс, чтобы заставить его (или другие связанные процессы) выйти.
Использование сторонних приложений для принудительного закрытия приложений
Как показывают приведенные выше методы, Windows включает множество методов принудительного выхода из приложений. Однако, если вам нужен более быстрый способ принудительного закрытия приложений, вам нужно обратиться к сторонним решениям.
Одним из лучших и самых простых сторонних приложений для этой цели является SuperF4. Это приложение имеет простую цель: вы можете быстро принудительно закрыть любое приложение с помощью сочетания клавиш (в данном случае Ctrl + Alt + F4).
Это воспроизводит эффект команды taskkill, используемой в терминале PowerShell, что делает ее более надежной командой по сравнению с клавиатурной командой Alt-F4, включенной в Windows.
- Чтобы использовать SuperF4, скачать и установить сначала (или вместо этого загрузите и разархивируйте портативную версию приложения). После установки запустите приложение SuperF4 (или файл SuperF4.exe в переносном каталоге), чтобы начать.
- SuperF4 работает в фоновом режиме, но вы можете проверить его работу, проверив значки в области уведомлений на панели задач. Если вы хотите, чтобы он запускался автоматически, щелкните правой кнопкой мыши значок SuperF4 на панели задач, затем выберите «Параметры»> «Автозапуск».
- По умолчанию SuperF4 не запускается с правами администратора. Если это отключено, SuperF4 не будет иметь права принудительно закрывать все приложения (особенно некоторые системные приложения). Если вы хотите предоставить ему эту опцию, щелкните правой кнопкой мыши значок SuperF4 на панели задач и выберите «Поднять». Чтобы включить это автоматически, выберите Параметры> Поднять при автозапуске впоследствии.
- Чтобы принудительно закрыть приложение с помощью SuperF4, убедитесь, что окно приложения активно. В активном окне нажмите Ctrl + ALT + F4 на клавиатуре, чтобы приложение закрылось.
Исправление не отвечающих приложений Windows
Теперь вы знаете, как принудительно завершить работу в Windows, и в будущем сможете быстро решать проблемы с неотзывчивыми приложениями. Большинство приложений должно завершаться автоматически, но если Windows не закрывает их, вы можете вместо этого использовать диспетчер задач, PowerShell или стороннее приложение, такое как SuperF4.
Если установленная программа вызывает проблемы, лучше всего удалить ее. Есть несколько способов удалить программное обеспечение в Windows 10, хотя процесс удаления приложений из Microsoft Store немного отличается. Если вы не знаете, что вы установили, вы можете создать список установленного программного обеспечения для просмотра в первую очередь.
Программы для Windows, мобильные приложения, игры — ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале — Подписывайтесь:)
Источник: mexn.ru