Обработка сигнала SIGINT сигнал для программы сервера


Я создал небольшую программу-сервер, которая шифрует текст с помощью именованного канала:

#define UNICODE
#define WIN32_WINNT 0x0500
#include <stdio.h>
#include <windows.h>
#include <signal.h>



HANDLE hPipe;
DWORD WINAPI ServerProc(LPVOID lpVoid)
{


    hPipe = CreateNamedPipe(L"\\\\.\\pipe\\testpipe", PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE |PIPE_WAIT, 1, 256, 256, 0, NULL);
    if(!hPipe)
        return wprintf(L"ERROR : Cannot create pipe.\n");

    while(ConnectNamedPipe(hPipe, NULL))
    {
        WCHAR szText[80] = {0};
        DWORD dwSize;
        INT i;

        ReadFile(hPipe, szText, 158, &dwSize, NULL);

        for(i = 0; i < dwSize; i++)
            szText[i] ^= '#';

        WriteFile(hPipe, szText, 158, &dwSize, NULL);
        FlushFileBuffers(hPipe);
            DisconnectNamedPipe(hPipe);
    }

    CloseHandle(hPipe);

    return 0;
}

void SignalHandler(int signal)
{
    DisconnectNamedPipe(hPipe);
    CloseHandle(hPipe);
    printf("Application closing...\n");
    exit(0);
}


int wmain(void)
{
    HANDLE hThread;

    signal(SIGINT, SignalHandler);  

    hThread = CreateThread(NULL, 0, ServerProc, NULL, 0, NULL);

    WaitForSingleObject(hThread, INFINITE);

    CloseHandle(hThread);
}

В этом коде я создал hPipe ручка как глобальные, потому что моя программа поток и обработчик сигнала как нужно обрабатывать.

Это правильный способ обработки сигналов?



2237
4
задан 17 февраля 2011 в 08:02 Источник Поделиться
Комментарии
1 ответ

Это зависит от того, что вы хотите, чтобы сервер делать, когда прерывание посылается.

Если вы действительно хотите, чтобы программа останавливается, когда он отправляется запрос на прерывание, даже если это сервис (Windows) или демона (в Unix), то что ты сделал работает. Если, однако, программа была запущена с настройками, чтобы игнорировать прерывания, код переопределения. Каноническая последовательность для установки обработчика сигнала (для сигнала количество Сигнум) является:

if (signal(signum, SIG_IGN) != SIG_IGN)
signal(signum, sighandler);

Если программа игнорирует сигнал, он продолжает это делать. В противном случае, он устанавливает свой собственный обработчик для обработки сигнала.

На Unix, вы обычно используете команды SIGTERM, чтобы сделать контролируемой остановки программы, и для демонов, вы, как правило, используют сигнал SIGHUP, чтобы указать, что демон должен вернуться к своей конфигурации.

Кроме того, в POSIX миру, как правило, рекомендуется использовать вызов sigaction() , а не сигнал() , потому что он дает различные гарантии о том, что происходит.

Если вашей программе необходимо продолжить после получения сигнала, вам придется сбросить обработчик сигнала в обработчик сигнала - и есть окно уязвимости, что означает, что если два сигнала передаются достаточно быстро, программа останавливается, несмотря на свой обработчик. Используя вызов sigaction() позволяет избежать этого времени уязвимости.

3
ответ дан 17 февраля 2011 в 03:02 Источник Поделиться