Эквивалент Mac OS X для TerminateProcess(GetCurrentProcess,0);

Я ищу простой и незаметный способ завершить порт Mac моего приложения C++. В Windows я использовал

TerminateProcess(GetCurrentProcess, 0);

Какую эквивалентную команду я могу использовать с Mac OS X/XCode/GCC?


person Adrian Grigore    schedule 19.02.2009    source источник
comment
Связано: stackoverflow. ком/вопросы/397075/   -  person Éric Malenfant    schedule 19.02.2009
comment
Просто для справки: Windows _exit() выполняет некоторую очистку перед вызовом ExitProcess(). Я предполагаю, что функция exit() такая же, но с некоторым расширенным кодом очистки.   -  person Luke Quinane    schedule 07.05.2009


Ответы (5)


На самом деле вам нужен _exit, если вы хотите иметь ту же семантику, что и TerminateProcess. Семантика exit более тесно связана с ExitProcess.

person Matt Davison    schedule 19.02.2009

Ближе к ProcessTerminate будет отправить SIGKILL с kill, оба немедленно завершают текущий процесс и не могут быть перехвачены. Это то же самое, что и _exit.

kill(getpid(), SIGKILL);
person Ismael    schedule 19.02.2009
comment
Или, немного проще: raise(SIGKILL). - person Peter Hosey; 06.09.2009

выход (0);


person Community    schedule 19.02.2009
comment
exit больше похож на ExitProcess, который пытается корректно завершить работу приложения, но это может привести к сбою. TerminateProces является безусловным и не может быть перехвачен. - person Ismael; 19.02.2009

Имейте в виду, что если вы вызовете exit() или TerminateProcess(), вы немедленно завершите свое приложение, т.е. никаких вызовов деструктора, никакая очистка, которую вы можете ожидать, не будет выполнена (конечно, ОС очищает все, что может) .

person n0rd    schedule 19.02.2009
comment
exit вызовет функции, зарегистрированные с помощью atexit, так что это не одно и то же. - person Ismael; 19.02.2009

На самом деле и exit(), и _exit() задействуют CRT, а это означает, что различные действия по-прежнему выполняются. (насчет atexit не уверен, не проверял)

TerminateProcess в Windows находится на уровне ОС, поэтому он обходит все CRT. Если вы хотите сделать то же самое на Mac, лучше всего запачкать руки функциями Mach. В таком случае:

#include <mach/mach.h>

... // lots of your code here

task_terminate(mach_task_self());

Это настолько неуловимо, насколько это возможно.

person user331151    schedule 28.10.2010