2014-09-09 20 views
5

Quando uso SIGUSR1 nelle funzioni kill() o signal(), che cosa sta facendo? È una macro? Ho letto che era definito dall'utente, ma dove è definito? Posso creare un SIGUSR10 (o programmare in modo programmato un "array" di diversi tipi di segnale)?C- cos'è esattamente SIGUSR1 sintatticamente

+0

Probabilmente è definito in "" o un file incluso da quello. Non puoi costruirti di nascosto i tuoi. –

+0

'SIGUSR1' è 'definito dall'utente' perché l'implementazione non genera mai' SIGUSR1' stesso (mentre i segnali come 'SIGHUP',' SIGINT', 'SIGQUIT',' SIGPIPE', 'SIGTERM' sono generati dal sistema occasionalmente) . –

risposta

10

segnali definiti dall'utente significa che questi segnali non hanno alcun significato preciso a differenza SIGSEGV, SIGCONT, SIGSTOP, ecc Il kernel non potrà mai inviare SIGUSR1 o SIGUSR2 ad un processo, in modo che il significato del segnale possono essere impostate da voi come per la esigenze della tua applicazione. Tutte queste costanti maiuscole SIG sono in realtà macro che si espandono in un numero intero che indica un numero di segnale nella particolare implementazione. Anche se i segnali definiti dall'utente non necessariamente devono essere definiti, i numeri dei segnali sono già corretti in un'implementazione particolare e possono essere riutilizzati in modo sicuro poiché non verranno inviati da nulla tranne che per l'utente.

Tradizionalmente, ci sono stati due segnali definiti dall'utente: SIGUSR1 e SIGUSR2. Tuttavia, le implementazioni recenti hanno qualcosa chiamato "segnali realtime POSIX" che offrono molti altri segnali definiti dall'utente.

3

SIGUSR è, come suggerisce il nome, un segnale riservato all'uso da parte dell'utente (sviluppatore), senza alcun significato "speciale" predefinito. Non puoi farne 10, nella maggior parte dei sistemi POSIX ce ne sono esattamente due: SIGUSR1 e SIGUSR2.

Il simbolo stesso può o non può essere un'espansione macro, ma finirà per essere un valore numerico assegnato-compatibile con int.

Per utilizzarlo in modo significativo, è necessario scrivere un gestore di segnale. Vedere la manpage signal() per i dettagli su come farlo.

+2

In realtà, [POSIX definisce] (http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html#tag_13_43): _L'intestazione definisce i seguenti macro utilizzati per fare riferimento ai segnali che si verificano nel sistema. I segnali qui definiti iniziano con le lettere 'SIG' seguite da una lettera maiuscola. Le macro devono espandersi in espressioni di costante intero positivo con tipo 'int' e valori distinti. Quindi i nomi dei segnali dovrebbero essere macro. –