2012-03-27 198 views

回答

3

Core Foundation有一个宏观HALT应该做的伎俩,如果你真的真的认为有必要做到这一点:

#if defined(__ppc__) 
    #define HALT do {asm __volatile__("trap"); kill(getpid(), 9); } while (0) 
#elif defined(__i386__) || defined(__x86_64__) 
    #if defined(__GNUC__) 
     #define HALT do {asm __volatile__("int3"); kill(getpid(), 9); } while (0) 
    #elif defined(_MSC_VER) 
     #define HALT do { DebugBreak(); abort(); } while (0) 
    #else 
     #error Compiler not supported 
    #endif 
#endif 
#if defined(__arm__) 
    #define HALT do {asm __volatile__("bkpt 0xCF"); kill(getpid(), 9); } while (0) 
#endif 
+0

这些都很好,但有一些问题。 asm指令基本上是断点生成器,如果你希望附加一个调试器,这很好,但也许不是你想要的东西(例如:在windows上它会默认触发一个崩溃/调试对话框)。噢,一个叫做abort()的MSC可以,但是仍然比TerminateProcess()拥有更多的基础设施/残留() – Joe 2012-03-27 23:07:00

+0

@Joe:我不认为以任何方式做这件事都是一个好主意。 CF只使用这个宏来致命错误。就我而言,这个问题的正确答案是“是的,但你不应该”。请注意,我没有写这些,而且它们正在被使用。 – 2012-03-27 23:10:43

+0

这个技巧很好!谢谢! @Joe:断点生成器对我来说是完美的*。 – andyvn22 2012-03-27 23:18:39

1

如果您使用的是Macintosh应用程序,“[[NSApp sharedApplication] terminate: self]”将起作用。

通过iPhone,你甚至可以做“exit(-1)”,但苹果将接受突然或以任何方式终止用户以外杀死自己的应用程序的所有应用。 Here is a related question with some useful answers for you

0

假设你不喜欢的exit()或_exit( ),其中有一些清理工作的语义,你可以使用S

#include <signal.h> 

kill(getpid(), SIGKILL); 

去,如果你使用的是Windows(假设没有因为“可可”的标签),您可以使用

TerminateProcess(GetCurrentProcess(), -1); 

这是非常苛刻的,所以事情应该是非常糟糕的做到这一点。