Como se estabelece SIGRTMIN em tempo de execução?

1

Lendo em signal(7) Eu posso ver isso agora: dois, mas uma vez: três; os números de sinal anteriores 31 são reservados para uso pelo sistema de sinal em tempo real e não devem ser usados:

Real-time Signals

Linux supports real-time signals as originally defined in the POSIX.1b real-time extensions (and now included in POSIX.1-2001). The range of supported real-time signals is defined by the macros SIGRTMIN and SIGRTMAX. POSIX.1-2001 requires that an implementation support at least POSIX_RTSIG_MAX(8) real-time signals.

The Linux kernel supports a range of 32 different real-time signals, numbered 33 to 64. However, the glibc POSIX threads implementation internally uses two (for NPTL) or three (for LinuxThreads) real-time signals (see pthreads(7)), and adjusts the value of SIGRTMIN suitably (to 34 or 35). Because the range of available real-time signals varies according to the glibc threading implementation (and this variation can occur at run time according to the available kernel and glibc), and indeed the range of real-time signals varies across UNIX systems, programs should never refer to real-time signals using hard-coded numbers, but instead should always refer to real-time signals using the notation SIGRTMIN+n, and include suitable (run-time) checks that SIGRTMIN+n does not exceed SIGRTMAX.

Então, como eu determino o valor (em um programa C que precisa configurar o tratamento de sinal para si mesmo e para qualquer filho) do SIGRTMIN quando o programa está rodando? Analisei as perguntas e as respostas aqui, mas todas parecem tratar SIGRTMIN como se fosse um #define SIGRTMIN 34 quando a página man diz que isso não deve ser feito!

    
por SlySven 29.02.2016 / 08:56

1 resposta

0

Estupidamente eu tinha esquecido que coisas que são #define d não são constantes a menos que sejam escritas dessa maneira!

Como o @RuiFRibeiro aponta no arquivo /usr/include/ específico da arquitetura /bits/signum.h include na parte inferior, está o par de MACROS que fornece o que é necessário:

#define SIGUNUSED   31

#define _NSIG       65  /* Biggest signal number + 1  
                   (including real-time signals).  */

#define SIGRTMIN        (__libc_current_sigrtmin ())  
#define SIGRTMAX        (__libc_current_sigrtmax ())  

/* These are the hard limits of the kernel.  These values should not be
   used directly at user level.  */
#define __SIGRTMIN  32  
#define __SIGRTMAX  (_NSIG - 1)

Então, agora eu sei como evitar que os manipuladores de sinais sejam substituídos por aqueles reservados. Suspeito que qualquer tentativa seria rejeitada de qualquer forma, mas para relatar erros é melhor saber quais são os limites e não determiná-los. sugá-lo e ver abordagem!

    
por 29.02.2016 / 10:07