, чтобы сделать это, вам нужно заставить вашу программу наблюдать что-то, например глобальную переменную, которая скажет ему прекратить то, что она делает.
Например, предположим, что ваша долгосрочная программа выполняетцикл, вы можете сделать это:
g_shouldAbort = 0;
while(!finished)
{
// (do some computing)
if (g_shouldAbort)
{
// save variables and stuff
break; // exit the loop
}
}
с g_shouldAbort, определенным как глобальная volatile переменная, например:
static volatile int g_shouldAbort = 0;
(Очень важно объявить его «volatile», иначе компилятор, видя, что никто не записывает его в цикл, может посчитать, что if (g_shouldAbort) всегда будет ложным, и оптимизировать его.)
thenиспользуя, например, API signal , который предлагали другие пользователи, вы можете сделать это:
void signal_handler(int sig_code)
{
if (sig_code == SIGUSR1) // user-defined signal 1
g_shouldAbort = 1;
}
(вам, конечно, нужно зарегистрировать этот обработчик, см. здесь .
signal(SIGUSR, signal_handler);
Затем, когда вы «отправляете» сигнал SIGUSR1 в вашу программу (например, с помощью команды kill ), g_shouldAbort будет установлен в 1, и ваша программа остановится.его вычисления.
Надеюсь, что это поможет!
ПРИМЕЧАНИЕ: эта техника проста, но грубая.Использование сигналов и глобальных переменных, конечно, затрудняет использование нескольких потоков, как наметили другие пользователи.