2013-07-17 5 views
1

Я изучаю C и системное программирование. Мне нужно создать три обработчика сигналов, и как только они будут созданы, программа должна отправить сигналы себе в следующем порядке: SIGUSR1, SIGUSR2 и SIGINT. Ниже мой код. Он не работает (например, когда я компилирую в терминале - я печатаю ./prog1 и нажимаю control-C, программа должна печатать «Caught SIGINT, Exiting» и выйти. Я не получал никаких ошибок, но он просто возвращает к следующей строке с ничего. Может кто-то посмотреть и мне точку в правильном направлении? Большое вам спасибо за вашу помощь!Использование сигнала, обработчика, kill и getpid в C

#include <signal.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 

static void sigHandler_sigusr1(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGUSR1\n", getpid()); 
    kill(getpid(), SIGUSR1); 
} 

static void sigHandler_sigusr2(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGSR2\n", getpid()); 
    kill(getpid(), SIGUSR2); 
} 

static void sigHandler_sigint(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGINT, Exiting\n", getpid()); 
    kill(getpid(), SIGINT); 
    exit(EXIT_SUCCESS); 
} 


int main(int argc, char *argv[]) 
{ 
    if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR1\n"); 

    if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR2\n"); 

    if (signal(SIGINT, sigHandler_sigint) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR1\n"); 

    return 0; 
} 
+1

Вы попробовали время (1); до возвращения? – Alexis

+1

А также добавьте% d для печати getpid(). – Jeyaram

+0

«* ... программа должна посылать сигналы себе в следующем порядке: ... *" чтобы она выполнялась так, как это 'main()' должна что-то сделать, чтобы инициировать это, в настоящее время это не так. – alk

ответ

1

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

Для понимания

заключите while(1) в основной программе, т.е. nd теперь нажмите ctr + C. Вы получите ожидаемый результат.

#include <signal.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
static void sigHandler_sigusr1(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGUSR1\n"); 
    kill(getpid(), SIGUSR1); 
} 
static void sigHandler_sigusr2(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGSR2\n"); 
    kill(getpid(), SIGUSR2); 
} 
static void sigHandler_sigint(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGINT, Existing\n", getpid()); 
    kill(getpid(), SIGINT); 
    exit(EXIT_SUCCESS); 
} 
int main(int argc, char *argv[]) 
{ 
     if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR) 
      printf("Unable to create handler for SIGUSR1\n"); 
     if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR) 
      printf("Unable to create handler for SIGUSR2\n"); 
     if (signal(SIGINT, sigHandler_sigint) == SIG_ERR) 
      printf("Unable to create handler for SIGUSR1\n"); 
     while(1){ 
     /*some work*/ 
     } 

    return 0; 
} 

Не используйте printf внутри обработчика сигнала. см. this post для получения дополнительной информации.

1

Модифицировано main() будет работать.

int main(int argc, char *argv[]) 
{ 
    if (signal(SIGUSR1, sigHandler_sigusr1) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR1\n"); 

    if (signal(SIGUSR2, sigHandler_sigusr2) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR2\n"); 

    if (signal(SIGINT, sigHandler_sigint) == SIG_ERR) 
     printf("Unable to create handler for SIGUSR1\n"); 

    while(1) 
    { 
     sleep(1); 
    } 

    return 0; 
} 

В вашем коде, после регистрации обработчика сигнала, выполнение завершено. while(1) добавлен, чтобы ваш код работал, поэтому, когда вызывается CTRL + C, вызывается обработчик.

Также добавьте #include <unistd.h> для функции getpid(). И добавьте %d в

printf("Caught SIGSR2\n", getpid()); 
Смежные вопросы