Немедленно остановить выполнение приложения - PullRequest
3 голосов
/ 28 марта 2012

Есть ли способ остановить выполнение, что-то вроде SIG_ABRT, но немедленно , даже если мы не в основном потоке?

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Базовая основа содержит макрос 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
1 голос
/ 28 марта 2012

Если вы используете приложение для Macintosh, «[[NSApp sharedApplication] terminate: self]» будет работать.

На iPhone вы даже можете сделать «exit(-1)», но Apple будет НЕ принимает любые приложения, которые внезапно или каким-либо образом завершают свою работу, кроме того, что пользователь сам убивает приложение. Вот связанный вопрос с несколькими полезными для вас ответами .

0 голосов
/ 28 марта 2012

Если вам не нравятся exit () или _exit (), которые имеют некоторую семантику очистки, вы можете перейти с s

#include <signal.h>

kill( getpid(), SIGKILL );

А если вы находитесь в Windows (если только вы не пометили «какао»), вы можете использовать

TerminateProcess( GetCurrentProcess(), -1 );

Это все довольно грубо, поэтому для этого все должно быть довольно плохо.

...