template <typename SigSetT> int SigAddSet(SigSetT* set, int sig) { int bit = sig - 1; // Signal numbers start at 1, but bit positions start at 0. unsignedlong* local_set = reinterpret_cast<unsignedlong*>(set); if (set == nullptr || bit < 0 || bit >= static_cast<int>(8*sizeof(*set))) {
errno = EINVAL; return -1;
}
local_set[bit / LONG_BIT] |= 1UL << (bit % LONG_BIT); return0;
}
int sigaddset(sigset_t* set, int sig) { return SigAddSet(set, sig);
}
int sigaddset64(sigset64_t* set, int sig) { return SigAddSet(set, sig);
}
union BsdSigSet { int mask;
sigset64_t set;
};
// This isn't in our header files, but is exposed on all architectures except riscv64. extern"C"int sigblock(int mask) {
BsdSigSet in{.mask = mask}, out; if (sigprocmask64(SIG_BLOCK, &in.set, &out.set) == -1) return -1; return out.mask;
}
// This isn't in our header files, but is exposed on all architectures except riscv64. extern"C"int sigsetmask(int mask) {
BsdSigSet in{.mask = mask}, out; if (sigprocmask64(SIG_SETMASK, &in.set, &out.set) == -1) return -1; return out.mask;
}
template <typename SigSetT> int SigDelSet(SigSetT* set, int sig) { int bit = sig - 1; // Signal numbers start at 1, but bit positions start at 0. unsignedlong* local_set = reinterpret_cast<unsignedlong*>(set); if (set == nullptr || bit < 0 || bit >= static_cast<int>(8*sizeof(*set))) {
errno = EINVAL; return -1;
}
local_set[bit / LONG_BIT] &= ~(1UL << (bit % LONG_BIT)); return0;
}
int sigdelset(sigset_t* set, int sig) { return SigDelSet(set, sig);
}
int sigdelset64(sigset64_t* set, int sig) { return SigDelSet(set, sig);
}
int sigfillset(sigset_t* set) { return SigFillSet(set);
}
int sigfillset64(sigset64_t* set) { return SigFillSet(set);
}
int sighold(int sig) {
sigset64_t set = {}; if (sigaddset64(&set, sig) == -1) return -1; return sigprocmask64(SIG_BLOCK, &set, nullptr);
}
int sigignore(int sig) { struct sigaction64 sa = { .sa_handler = SIG_IGN }; return sigaction64(sig, &sa, nullptr);
}
int siginterrupt(int sig, int flag) { struct sigaction64 act;
sigaction64(sig, nullptr, &act); if (flag) {
act.sa_flags &= ~SA_RESTART;
} else {
act.sa_flags |= SA_RESTART;
} return sigaction64(sig, &act, nullptr);
}
template <typename SigSetT> int SigIsMember(const SigSetT* set, int sig) { int bit = sig - 1; // Signal numbers start at 1, but bit positions start at 0. constunsignedlong* local_set = reinterpret_cast<constunsignedlong*>(set); if (set == nullptr || bit < 0 || bit >= static_cast<int>(8*sizeof(*set))) {
errno = EINVAL; return -1;
} returnstatic_cast<int>((local_set[bit / LONG_BIT] >> (bit % LONG_BIT)) & 1);
}
int sigismember(const sigset_t* set, int sig) { return SigIsMember(set, sig);
}
int sigismember64(const sigset64_t* set, int sig) { return SigIsMember(set, sig);
}
int sigwait64(const sigset64_t* set, int* sig) { // sigtimedwait64() doesn't fail with EINVAL on Linux, // and EAGAIN can only happen with a timeout, // so the error reporting here is effectively dead code.
ErrnoRestorer errno_restorer; int result = TEMP_FAILURE_RETRY(sigtimedwait64(set, nullptr, nullptr)); if (result == -1) return errno;
*sig = result; return0;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.