2016-06-01 12 views
1

Ich habe die folgende Struktur:Wie mehr als eine Flagge in sigaction.sa_flags setzen

struct sigaction sa1; 
sa1.sa_flags=SA_SIGINFO; 
sa1.sa_flags=SA_NODEFER; 
sa1.sa_sigaction = handler; 
sigaction(SIGUSR1,&sa1,NULL); 

Wie kann ich SA_SIGINFO zusammen mit SA_NODEFER verwenden, ohne die zweiten Flag Herstellung des ersten überschreibt?

Antwort

2

The manual page hat die Antwort:

Es durch die bitweise gebildet wird, oder von null oder mehr der folgenden: [...]

So würden Sie etwas tun, wie

Diese Art, mehrere unabhängige Flags als einzelne Bits in einer Ganzzahl darzustellen, ist in der gesamten Programmierung sehr verbreitet, und sicherlich in C. Es ist easil y verfügbar, da die bitweise Manipulation in C einfach und oft wünschenswert ist, da es sich um eine sehr einfache Implementierung handelt.

Eine „moderne“ (ausführlich und/oder Bloaty McBloatface) Ansatz Bitfelder in einer Struktur zu verwenden, könnte sein:

struct sigaction { 
    /* ... */ 
    struct { 
    unsigned int sa_nocldstop : 1; 
    unsigned int sa_nocldwait : 1; 
    unsigned int sa_nodefer : 1; 
    unsigned int sa_nostack : 1; 
    unsigned int sa_siginfo : 1; 
    /* ... */ 
    } sa_flags; 
    /* ... */ 
}; 

Dies macht das sa_flags Mitglied in struct sigaction selbst ein struct sein, die besteht aus ein Bündel von 1-Bit breiten unsigned int Mitgliedern. Dies wird normalerweise auf den gleichen bitweisen Code kompiliert, aber es ist klarer.

Sie würden mehrere Flags gesetzt durch explizite Sätze tun:

sa1.sa_flags.sa_nodefer = 1; 
sa1.sa_flags.sa_siginfo = 1; 

und Sie würden eine andere Art und Weise müssen sicherstellen, dass der Rest auf 0

gesetzt wurde