LINUX.ORG.RU

sigaction (2), не получается SIG_IGN


0

1

Хочу игнорировать SIGINT установкой на него SIG_IGN при помощи sigaction(). Приблизительно так:

struct sigaction ourAct;
main()
{
	int cnt = 0;
	
	ourAct.sa_handler = SIG_IGN;
	ourAct.sa_sigaction = NULL;
	sigemptyset(&ourAct.sa_mask);
	ourAct.sa_flags = 0;
	
	sigaction(SIGINT, &ourAct, NULL)

	pause()
}
Но указанный сигнал программа не игнорит. Если же пробую signal() вместо sigaction() то все срабатывает нормально. Что я делаю не так?

★★★

sa_handler и sa_sigaction — это union. Т.е. сначала ты его устанавливаешь (SIG_IGN) и тут же обнуляешь. Вот так будет работать:

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

int
main()
{
        struct sigaction sa;

        sigemptyset(&sa.sa_mask);
        sa.sa_handler = SIG_IGN;
        sa.sa_flags = 0;
        sigaction(SIGINT, &sa, NULL);

        pause();

        return 0;
}

UPD: в манах сила, но только не в «гнутых» :( Используй лучше «бздшные» или «маковые», про «гнуные» просто забудь. http://mdoc.su/o/sigaction

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

а что не так с гнутыми? там тоже английским по терминальному

On some architectures a union is involved: do not assign to both sa_handler and sa_sigaction.

ananas ★★★★★
()
Ответ на: комментарий от ananas

есть ужасная болезень, BSD головного мозга. Лечить ещё не научились

mashina ★★★★★
()
Ответ на: комментарий от ananas

Вот! А достаточно было просто привести стурктуру, а не разпинаться графоманным текстом.

К тому же оно и не точное, ибо не «on some», а «on all».

beastie ★★★★★
()
Ответ на: комментарий от beastie

в структуре union на обработчики об-ifdef-лен. сама структура в man-е приведена. так что твой ответ ну очень на брюзжание не по делу похож

ananas ★★★★★
()
Ответ на: комментарий от ananas

Дай побрюзжать. =)

Приведена, но не совсем правильно (deb7):

       The sigaction structure is defined as something like:

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

       On some architectures a union is involved: do not assign to both sa_handler and sa_sigaction.

Особенно доставляет «as something like». (В манах не место «как-то так»!)

Versus (*bsd):

SYNOPSIS
     #include <signal.h>

     struct sigaction {
             union {         /* signal handler */
                     void    (*__sa_handler)(int);
                     void    (*__sa_sigaction)(int, siginfo_t *, void *);
             } __sigaction_u;
             sigset_t sa_mask;          /* signal mask to apply */
             int      sa_flags;         /* see signal options below */
     };

     #define sa_handler  __sigaction_u.__sa_handler
     #define sa_sigaction     __sigaction_u.__sa_sigaction

Почувстуй разницу.

А в самой шапке за-ifdef-ино совсем другое и только в линуксе (sa_sigaction в пре-posix-93 может не быть).

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)

beastie
ananas
mashina

Парни, большое всем спасибо. Меня подвело именно «some architectures» и приведение структуры без union, этож ведь линуксовый ман.

normann ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.