2015-06-19 2 views
0

Я разрабатываю серверное приложение и хочу использовать SIGINT для уничтожения приложения. Хотя я знаю два способа, я не уверен, что это хороший способ убить это приложение.Что хорошего в использовании SIGINT для убийства приложения на C++?

Есть ли лучшие способы обработки SIGING?

int main() { 
startServer(); 

1. while(true) {sleep(3); if(sigFlag) break;} 
2. std::getline(std::cin, param); 

stopServer(); 
return 0; 
} 

ответ

1
#include<stdio.h> 
#include<signal.h> 
#include<unistd.h> 

bool run = true; 

void sig_handler(int signo) 
{ 
    if (signo == SIGINT) 
    { 
    printf("received SIGINT\n"); 
    run = false; 
    } 
} 

int main(void) 
{ 
    if (signal(SIGINT, sig_handler) == SIG_ERR) 
    printf("\ncan't catch SIGINT\n"); 
    // A long long wait so that we can easily issue a signal to this process 
    while(run) 
    sleep(1); 
    return 0; 
} 

Источник: http://www.thegeekstuff.com/2012/03/catch-signals-sample-c-code/

Вместо PRINTF использования возвращения или выхода

+0

Как это ответить на вопрос? Он хочет убить процесс, а не обрабатывать попытки убийства. – wallyk

+0

@wallyk, можете ли вы уточнить, где OP-состояния хотят уничтожить внешний процесс? Поскольку я (и, вероятно, этот ответ) прочитал вопрос, они хотят знать хороший способ обработки сигнала SIGINT в приложении C++ (не обрабатывать 'SIGINT' для отдельного процесса). ?? – txtechhelp

+1

Также стоит отметить, что OP использует Windows, средство C 'signal' - это всего лишь половина уравнения; WINAPI имеет 'SetConsoleCtrlHandler', который обрабатывает события CTRL + C (системы POSIX, которые используют' signal', поймают сигнал 'SIGINT' на событии' CTRL + C', Windows должна установить 'SetConsolCtrlHandler'). – txtechhelp

0

Первый метод лучше. Серверное приложение должно запускать фоновое изображение и не может обрабатывать ввод и вывод от завершения.

Другим ключевым моментом является второй способ блокировки сервера. Метод сигнала может избежать этой проблемы.