Как заставить Ctrl-c завершить программу

Я хочу, чтобы программа проверяла перехват сигнала, нажимая CTRL+C для генерации сигнала типа SIGINT. Я не знаю, моя программа просто считает первый сигнал прерывания и завершает программу (просто переходит прямо в функцию INThandler)

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

void signalHandler( int signalValue ); /* prototype */
void  INThandler(int signalValue);


int main( void )
{
 int i; /* counter used to loop 100 times */
 int x; /* variable to hold random values between 1-50 */

 signal( SIGUSR1, signalHandler ); 
 signal(SIGUSR1, INThandler);
 srand( time( NULL ) );


    for ( i = 1; i <= 100; i++ ) {
        x = 1 + rand() % 50;

        if ( x == 25 ) {
            raise( SIGUSR1 );
        } 
        printf( "%4d", i );


        if ( i % 10 == 0 ) {
            printf( "\n" );
        } 
    }
  return 0; 
} 


void signalHandler( int signalValue )
{
  int response; 

  printf( "%s%d%s\n%s","\nInterrupt signal ( ", signalValue, " ) received.",
                     "Do you wish to continue ( 1 = yes or 2 = no )? \n" );

   scanf("%d", &response);
    if ( response == 1 ) {
        signal( SIGINT, signalHandler );
    }
    else {
    signal(SIGINT, INThandler);
    } 

}


void  INThandler(int signalValue)
{
  signal(signalValue, SIG_IGN);
  printf("\nCtrl-C command detected!");
  exit(0);

}

person Community    schedule 04.12.2014    source источник
comment
Сначала вы устанавливаете signalHandler для обработки SIGUSR1, затем вместо этого вы устанавливаете INThandler для его обработки. Что вы ожидаете?   -  person Biffen    schedule 04.12.2014


Ответы (2)


Ваш код в настоящее время говорит:

signal(SIGUSR1, signalHandler); 
signal(SIGUSR1, INThandler);

Первый вызов signal() эффективно игнорируется. Вы установили INThandler в качестве обработчика сигналов SIGUSR1, которые ваша программа отправляет сама, и вы не установили никакого обработчика сигналов для SIGINT.

person Jonathan Leffler    schedule 04.12.2014
comment
не могу поверить, что совершил такую ​​глупую ошибку, теперь все работает... спасибо! - person ; 04.12.2014
comment
См. также Как избежать использования printf() в сигнале обработчик? для получения информации о том, что вы можете и не можете делать в обработчике сигнала. Ваши сигналы поднимаются синхронно, а не асинхронно, что резко снижает связанные с этим риски. - person Jonathan Leffler; 04.12.2014

Не уверен, что вы делаете с SIGUSR1. Если вы хотите настроить обработчик для перехвата SIGINT, просто настройте обработчик сигнала с помощью signal( SIGINT, signalHandler ).

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

void signalHandler( int signalValue ); /* prototype */
void  INThandler(int signalValue);


int main( void )
{
    int i; /* counter used to loop 100 times */
    int x; /* variable to hold random values between 1-50 */

    signal( SIGINT, signalHandler ); 
    srand( time( NULL ) );


    for ( i = 1; i <= 100; i++ ) {
        x = 1 + rand() % 50;

        if ( x == 25 ) {
            raise( SIGUSR1 );
        } 
        printf( "%4d", i );


        if ( i % 10 == 0 ) {
            printf( "\n" );
        } 
        fflush( stdout );
        sleep( 1 );
    }
  return 0; 
} 


void signalHandler( int signalValue )
{
    signal( SIGINT, signalHandler );
    int response; 

    printf( "%s%d%s\n%s","\nInterrupt signal ( ", signalValue, " ) received.",
                     "Do you wish to continue ( 1 = yes or 2 = no )? \n" );

    scanf("%d", &response);
    if ( response != 1 ) {
        signal(SIGINT, INThandler);
    } 
}


void  INThandler(int signalValue)
{
    signal(signalValue, SIG_IGN);
    printf("\nCtrl-C command detected!");
    exit(0);
}
1   2   3^C
Interrupt signal ( 2 ) received.
Do you wish to continue ( 1 = yes or 2 = no )? 
1
   4   5   6   7^C
Interrupt signal ( 2 ) received.
Do you wish to continue ( 1 = yes or 2 = no )? 
1
   8   9  10
  11  12^C
Interrupt signal ( 2 ) received.
Do you wish to continue ( 1 = yes or 2 = no )? 
1
  13  14  15  16  17^C
Interrupt signal ( 2 ) received.
Do you wish to continue ( 1 = yes or 2 = no )? 

2
  18  19  20
  21  22^C
Ctrl-C command detected!---
person George Houpis    schedule 04.12.2014