Есть ли способ sigaction() для обработчика сигналов с несколькими параметрами?

#c #parameters #handler #signals

#c #параметры #обработчик #сигналы

Вопрос:

Я использую sigaction() для выполнения действия каждый раз, когда принимается SIGINT. Все учебные пособия, которые я видел, используют этот прототип в качестве обработчика сигналов

 void sig_handler(int sig);
  

Есть ли способ каким-то образом заставить это принимать больше параметров, чтобы оно соответствовало моим потребностям? Так, например

 void sig_handler(char* surname, int age);
  

Это мой код:

 void sig_handler(int sig) {
    printf("SIGINT(%d) receivedn", sig);
}

int main( ){
    struct sigaction act;
    act.sa_handler=sig_handler;

    sigaction(SIGINT, amp;act, NULL);

    while(1){};
    return 0 ;
}
  

Ответ №1:

Не напрямую, но вы могли бы установить глобальную переменную, которая сообщает вам sig_handler() , что делать.

 int ACTION = 0;

void sig_handler(int sig) {
    if (sig == SIGINT) {
        switch (ACTION) {
          case 0: other_function(char* surname, int age);
          break;
        // more cases
        default:
          ;
        }
    } else if ( ....  // more signals
    }
}

int main( ){
    struct sigaction act;
    act.sa_handler=sig_handler;

    sigaction(SIGINT, amp;act, NULL);

    while(1){};
    return 0 ;
}
  

Комментарии:

1. Я подумал об этом незадолго до того, как вы ответили, но вы все еще получаете мой голос: D

Ответ №2:

Вы не можете сделать это с сигналами. Как будут предоставлены и доставлены эти параметры? Сигнал — это просто заранее определенный числовой код, который заставляет процесс выполнять обработчик асинхронно, прерывая основной поток.

Однако вы можете использовать сокет Unix, канал или файл fifo для этого.