2013-07-17 2 views
2

Я новичок в C и системном программировании. Я написал программу, и она должна отображать следующее: Поймали SIGUSR1 Пойманный SIGUSR2 Пойманный SIGINTКак отображать выходные данные для sigusr1 и sigusr2?

Однако, когда я «./test.c», единственное, что я вижу, это „Caught SIGINT“, когда я печатаю Ctrl-C. Как я могу исправить свой код, чтобы моя программа отображала сообщения выше? Извините, если мой вопрос немой. Ваша помощь очень ценится. Спасибо за прочтение.

Редакция:

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

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

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

static void sigHandler_sigint(int sig) 
{ 
    //sig contains the signal number that was received 
    printf("Caught SIGINT, Existing, %d\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 SIGINT\n"); 

    kill(getpid(), SIGUSR1); 
    kill(getpid(), SIGUSR2); 
    kill(getpid(), SIGINT); 

    while (1) 
    { 
     sleep(1); 
    } 

    return 0; 
} 
+1

Мое предложение [избегать использования printf в обработчике сигнала] (http://stackoverflow.com/questions/16891019/how-to-avoid-using-printf-in-a-signal-handler/16891065#16891065) –

ответ

1

Это все выглядит хорошо.

С помощью SIGUSR вы должны явно называть их в программе. Вы не можете запускать их с помощью ctrl-z или ctrl-c.

У вас не было кода, в котором вы пытаетесь запускать сигналы.

+0

Как я могу инициировать сигналы в моем коде? Должен ли я помещать kill (getpid(), SIGUSR1) в мой основной метод? – user2203774

+0

Да, убить (getpid(), SIGUSR1) и убить (getpid(), SIGUSR2) –

+0

Привет. Я просто попробую это. Это не работает. Я разместил здесь свой новый код. Не возражаете взглянуть и сообщить мне, что мне не хватает? Спасибо за ваше время – user2203774

1

Я могу ошибаться, но SIGUSR1 и SIGUSR2 являются определенным пользователем сигналы.

Когда вы делаете «Ctrl-C», вы делаете прерывание, пойманное обработчиком SIGINT.

Для того, чтобы поймали SIGUSR1 анс SIGUSR2 вы должны бросить их сами:

kill(pid, SIGUSR1); 

More informations

+0

Привет. Означает ли это, что я должен положить kill (getpid(), SIGUSR1) в мой основной метод? – user2203774

2

Для того, чтобы активировать функцию обработчика сигнала, вам необходимо отправить сигнал на procces. Его код отсутствует.

Это, как вы посылаете сигнал к себе:

kill(getpid(), SIGUSR1); 

Вы должны сделать это для SIGUSR1 и SIGUSR2.

Причина, по которой вы можете видеть сообщение SIGINT, заключается в том, что когда вы нажимаете ctrl+c, вы фактически отправляете SIGINT по своему усмотрению.

+0

Привет. Означает ли это, что я должен положить kill (getpid(), SIGUSR1) в мой основной метод? – user2203774

+0

Да. Также 'kill (getpid(), SIGUSR2);' для того, чтобы активировать оба. И если вы хотите сделать 'SIGINT', не нажимая' crtl + c', вы должны сделать 'kill (getpid(), SIGINT);' –

+0

Привет. Я просто попробую это. Это не работает. Я напишу свой новый код здесь. Не возражаете взглянуть и сообщить мне, что мне не хватает? Спасибо за ваше время. – user2203774

Смежные вопросы