signal bit operation
include/linux/signal.h
#define _SIG_SET_BINOP(name, op) static inline void name(sigset_t *r, const sigset_t *a, const sigset_t *b) { unsigned long a0, a1, a2, a3, b0, b1, b2, b3; switch (_NSIG_WORDS) { case 4: a3 = a->sig[3]; a2 = a->sig[2]; b3 = b->sig[3]; b2 = b->sig[2]; r->sig[3] = op(a3, b3); r->sig[2] = op(a2, b2); case 2: a1 = a->sig[1]; b1 = b->sig[1]; r->sig[1] = op(a1, b1); case 1: a0 = a->sig[0]; b0 = b->sig[0]; r->sig[0] = op(a0, b0); break; default: BUILD_BUG(); } }
#define _sig_or(x,y) ((x) | (y)) _SIG_SET_BINOP(sigorsets, _sig_or) #define _sig_and(x,y) ((x) & (y)) _SIG_SET_BINOP(sigandsets, _sig_and) #define _sig_andn(x,y) ((x) & ~(y)) _SIG_SET_BINOP(sigandnsets, _sig_andn)
sigandnsets(d,s1,s2)
d = s1 & ~s2