2015-07-15 4 views
0

Я пытаюсь отправить сигнал SIGINT в основной поток из какого-то другого потока. Основной поток назначил обработчик для сигнала. Когда я посылаю первый сигнал, он попадает в обработчик. Но я хочу посылать сигнал непрерывно. но после обработки первого сигнала программа завершается. Я поставил цикл while. Поэтому я ожидаю, что он должен продолжать отправлять эти сигналы. Ниже мой кодКак отправить сигнал SIGINT несколько раз

#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 

static void catch_function(int signo) { 
    puts("Interactive attention signal caught."); 
} 

DWORD WINAPI MyThreadFunction(LPVOID lpParam) 
{ 
    while(1) 
    { 
     Sleep(50); 
     puts("Raising the interactive attention signal."); 
     if (raise(SIGINT) != 0) 
     { 
      fputs("Error raising the signal.\n", stderr); 
      return EXIT_FAILURE; 
     } 
    } 
return 0; 
} 


int main(void) 
{ 
    if (signal(SIGINT, catch_function) == SIG_ERR) { 
    fputs("An error occurred while setting a signal handler.\n", stderr); 
    return EXIT_FAILURE; 
    } 

    HANDLE thread; 
    DWORD threadId; 
    thread = CreateThread(NULL, 0, &MyThreadFunction, NULL, 0, &threadId); 
    if(!thread) 
    { 
     printf("CreateThread() failed"); 
    } 

    while(1) 
    { 
     Sleep(50); 
    } 
    puts("Exiting."); 
    return 0; 
} 

Выход следующего кода

Raising the interactive attention signal. 
Interactive attention signal caught. 
Raising the interactive attention signal. 

Я попытался с помощью простого примера также. Здесь я посылаю сигнал 3 раза, но только первый раз сигнал пойман. После этого программа прекратилась. Ниже приводится код

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

void signal_handler(int signal) 
{ 
    printf("Received signal %d\n", signal); 
} 

int main(void) 
{ 
    // Install a signal handler. 
    signal(SIGINT, signal_handler); 

    printf("Sending signal %d\n", SIGINT); 
    raise(SIGINT); 
    raise(SIGINT); 
    raise(SIGINT); 
    printf("Exit main()\n"); 
} 

Выход

sending signal 2 
Received signal 2 

Так что я хочу знать, как я могу продолжать посылать некоторые сигналы из одного потока в какой-то другой поток? Я хочу, чтобы один из моих потоков отправил сигналы SIGINT, и main поймает их и выполнит некоторые действия соответственно.

+0

Почему вы используете сигнал для * прерывания * в качестве сигнала «внимания»? Обычно это сигнал, отправленный при попытке отменить программу с помощью CTRL-C. Если вы поймаете его и у вас возникнет проблема с тем, что пользователь хочет прервать вашу программу, это будет невозможно, используя обычный стандартный способ. Вы можете использовать, например. 'SIGUSR1' или' SIGUSR2'. –

+0

@JoachimPileborg Я хочу сделать это и для окон. Я думаю, что я не могу использовать SIGUSER1 и SIGUSR2 для этого. Пожалуйста, дайте мне знать, если я ошибаюсь. –

+0

@JoachimPileborg можно посмотреть на http://stackoverflow.com/questions/31461171/signal-handler-getting-called-in-wrong-thread –

ответ

4

Обычно после первого сигнала обработчик сигнала сбрасывается на SIG_DFL (сигналы Unix V) и по умолчанию для SIG_INT для выхода из программы. Это то, что вы наблюдаете. Поэтому потребуется снова установить обработчик. Установите его снова в обработчике:

void signal_handler(int signal) 
{ 
    signal(SIGINT, signal_handler); 
    printf("Received signal %d\n", signal); 
} 

Лучше было бы использовать вместо sigaction, поскольку он не имеет такого поведения.

+0

С помощью 'sigaction' можно * контролировать * поведение с помощью флаг. –

+0

Да, не нужно переустанавливать, это очевидное преимущество между прочим. –

+0

@BlueMoon, пожалуйста, посмотрите http://stackoverflow.com/questions/31461171/signal-handler-getting-called-in-wrong-thread –