Какая польза от второй структуры (* oldact) в sigaction () - PullRequest
2 голосов
/ 03 сентября 2010

Я пытаюсь создать обработчик для сигнала выхода в c, и моя операционная система - Ubuntu.

Я использую метод sigaction для регистрации моего пользовательского метода обработчика.

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

Вот мой код

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

void CustomHandler(int signo)
{
    printf("Inside custom handler");
    switch(signo)
    {
    case SIGFPE:
        printf("ERROR: Illegal arithmatic operation.\n");
        break;

    }

    exit(signo);
}

void newCustomHandler(int signo)
{
    printf("Inside new custom handler");
    switch(signo)
    {
    case SIGINT:
        printf("ERROR: Illegal arithmatic operation.\n");
        break;

    }

    exit(signo);
}

int main(void)
{
    long value;
    int i;
    struct sigaction act = {CustomHandler};
    struct sigaction newact = {newCustomHandler};


    newact = act;
    sigaction(SIGINT, &newact, NULL); //whats the difference between this

    /*sigaction(SIGINT, &act, NULL); // and this?
    sigaction(SIGINT, NULL, &newact);*/


    for(i = 0; i < 5; i++)
    {
        printf("Value: ");
        scanf("%ld", &value);
        printf("Result = %ld\n", 2520 / value);
    }
}

Теперь, когда я запускаю программу и нажимаю Ctrl + c, она отображает пользовательский обработчик Inside Inside.

Я прочитал документацию для sigaction и там написано

Если действие не равно нулю, новое действие для Сигнал Signum устанавливается из акта. Если oldact не равен NULL, предыдущий действие сохраняется в oldact.

зачем мне передавать вторую структуру, когда я могу напрямую присваивать значения типа

newact = act

Спасибо.

Ответы [ 2 ]

5 голосов
/ 03 сентября 2010

oldact полезно для сброса предыдущего обработчика действий:

sigaction(SIGINT, &copyInterrupted, &previousHandler);
copy(something);
sigaction(SIGINT, &previousHandler, null);

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

1 голос
/ 03 сентября 2010

Когда вы звоните sigaction, вы заменяете старый обработчик новым;указатель oldact установлен так, чтобы указывать на информацию обработчика, действующую до этой замены.

Возможно, как это часто бывает, вы хотите, чтобы новые обработчики действовали только для ограниченной области кода: теперь, когда вы знаете, какой была конфигурация, прежде чем вы ее изменили, вы можете восстановить ее с помощьюеще один вызов sigaction, в конце этого региона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...