sigaction () не перехватывает сигнал SIGINT - PullRequest
0 голосов
/ 23 июня 2018

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

Код, написанный ниже, однако, завершается, даже если он выглядит хорошо для меня.Может быть, мне чего-то не хватает.Кто-то видит, почему это все еще заканчивается?

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

void handle() { printf("%s%d%s", "I won't die....: ", getpid(), "\n"); }

int main() {
  struct sigaction sa;
  sa.sa_handler = handle;
  int k = 0;
  sigaction(SIGINT, &sa, NULL);
  // signal(SIGINT, handle); //signal works just fine

  while (k < 60) {
    printf("%s", "sleeping... \n");
    sleep(1);
    k = k + 1;
  }
}

Дополнительная информация: Моя ОС - Windows, однако я компилирую и запускаю программу в Bash подсистемы Linux.

1 Ответ

0 голосов
/ 23 июня 2018

Откройте страницу руководства по sigaction() и поймите всех членов struct sigaction и заполните все члены struct sigaction.

struct sigaction {
            void     (*sa_handler)(int);
            void     (*sa_sigaction)(int, siginfo_t *, void *);
            sigset_t   sa_mask;
            int        sa_flags;
            void     (*sa_restorer)(void);
};

Здесь

struct sigaction sa;

Как указано @AnttiHaapala здесь sa - это переменная automatic длительности хранения, и вы не инициализировали ее члены, она вызывает неопределенное поведение , поскольку все остальные поля содержат мусор, кроме sa.sa_handler

Так что вам нужно заполнить других членов struct sigaction как

sa.sa_handler = handle;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);

Или инициализировать sa сам как

struct sigaction sa = {0};

Также не рекомендуется писать оператор printf() внутри обработчика сигнала, читайте здесь Как избежать использования printf в обработчике сигнала? .

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