On Apr 3 11:27, Petr Skočík wrote: > Hi. Correct me if I'm wrong but POSIX appears to define > > https://pubs.opengroup.org/onlinepubs/7908799/xsh/ucontext.h.html > > as, among other things, containing the field: > > sigset_t uc_sigmask the set of signals that are blocked when this > context is active > > and it also specifies that the third argument to a .sa_sigaction > signal handler is a ucontext_t* cast to void*. > > So it should follow that doing > > void act(int Sig, siginfo_t *Info, void *Uctx) > { > ucontext_t *uctx = Uctx; > sigfillset(&uctx->uc_sigmask); > } > > from a signal handler should alter the signal mask of the thread the > signal ran on. > > This is how Linux and MacOS behave, but not CygWin, as the following > program shows:
What you're asking for is really complicated. The context given to act is the context at the time the signal function is called. In Cygwin (lower case w) this is a copy of the context. sigfillset() has not the faintest clue where this context comes from, it just sets the signal mask value without taking any further action. There are no provisions to control if the called function changes the context, other than via setcontext / swapcontext, and I don't see that POSIX requires anything else. Both functions change the current thread's sigmask according to the value of uc_sigmask. HTH, Corinna -- Corinna Vinschen Cygwin Maintainer
signature.asc
Description: PGP signature