+Il campo \var{ss\_sp} di \struct{stack\_t} indica l'indirizzo base dello
+\textit{stack}, mentre \var{ss\_size} ne indica la dimensione; il campo
+\var{ss\_flags} invece indica lo stato dello \textit{stack}. Nell'indicare un
+nuovo \textit{stack} occorre inizializzare \var{ss\_sp} e \var{ss\_size}
+rispettivamente al puntatore e alla dimensione della memoria allocata, mentre
+\var{ss\_flags} deve essere nullo. Se invece si vuole disabilitare uno
+\textit{stack} occorre indicare \constd{SS\_DISABLE} come valore di
+\var{ss\_flags} e gli altri valori saranno ignorati.
+
+Se \param{oss} non è nullo verrà restituito dalla funzione indirizzo e
+dimensione dello \textit{stack} corrente nei relativi campi, mentre
+\var{ss\_flags} potrà assumere il valore \constd{SS\_ONSTACK} se il processo è
+in esecuzione sullo \textit{stack} alternativo (nel qual caso non è possibile
+cambiarlo) e \const{SS\_DISABLE} se questo non è abilitato.
+
+In genere si installa uno \textit{stack} alternativo per i segnali quando si
+teme di avere problemi di esaurimento dello \textit{stack} standard o di
+superamento di un limite (vedi sez.~\ref{sec:sys_resource_limit}) imposto con
+chiamate del tipo \code{setrlimit(RLIMIT\_STACK, \&rlim)}. In tal caso
+infatti si avrebbe un segnale di \signal{SIGSEGV}, che potrebbe essere gestito
+soltanto avendo abilitato uno \textit{stack} alternativo.
+
+Si tenga presente che le funzioni chiamate durante l'esecuzione sullo
+\textit{stack} alternativo continueranno ad usare quest'ultimo, che, al
+contrario di quanto avviene per lo \textit{stack} ordinario dei processi, non
+si accresce automaticamente (ed infatti eccederne le dimensioni può portare a
+conseguenze imprevedibili). Si ricordi infine che una chiamata ad una
+funzione della famiglia \func{exec} cancella ogni \textit{stack} alternativo.
+
+Abbiamo visto in fig.~\ref{fig:sig_sleep_incomplete} come si possa usare
+\func{longjmp} per uscire da un gestore rientrando direttamente nel corpo
+del programma, sappiamo però che nell'esecuzione di un gestore il segnale
+che l'ha invocato viene bloccato, e abbiamo detto che possiamo ulteriormente
+modificarlo con \func{sigprocmask}.
+
+Resta quindi il problema di cosa succede alla maschera dei segnali quando si
+esce da un gestore usando questa funzione. Il comportamento dipende
+dall'implementazione. In particolare la semantica usata da BSD prevede che sia
+ripristinata la maschera dei segnali precedente l'invocazione, come per un
+normale ritorno, mentre quella usata da System V no.
+
+Lo standard POSIX.1 non specifica questo comportamento per \func{setjmp} e
+\func{longjmp}, ed il comportamento della \acr{glibc} dipende da quale delle
+caratteristiche si sono abilitate con le macro viste in
+sez.~\ref{sec:intro_gcc_glibc_std}.
+
+Lo standard POSIX però prevede anche la presenza di altre due funzioni
+\funcd{sigsetjmp} e \funcd{siglongjmp}, che permettono di decidere in maniera
+esplicita quale dei due comportamenti il programma deve assumere; i loro
+prototipi sono:
+
+\begin{funcproto}{
+\fhead{setjmp.h}
+\fdecl{int sigsetjmp(sigjmp\_buf env, int savesigs)}
+\fdesc{Salva il contesto dello \textit{stack} e la maschera dei segnali.}
+\fdecl{void siglongjmp(sigjmp\_buf env, int val)}
+\fdesc{Ripristina il contesto dello \textit{stack} e la maschera dei segnali.}
+}
+
+{La funzioni sono identiche alle analoghe \func{setjmp} e \func{longjmp} di
+ sez.~\ref{sec:proc_longjmp} ed hanno gli stessi errori e valori di uscita.}
+\end{funcproto}
+
+Le due funzioni prendono come primo argomento la variabile su cui viene
+salvato il contesto dello \textit{stack} per permettere il salto non-locale;
+nel caso specifico essa è di tipo \typed{sigjmp\_buf}, e non \type{jmp\_buf}
+come per le analoghe di sez.~\ref{sec:proc_longjmp} in quanto in questo caso
+viene salvata anche la maschera dei segnali.
+
+Nel caso di \func{sigsetjmp}, se si specifica un valore di \param{savesigs}
+diverso da zero la maschera dei valori verrà salvata in \param{env} insieme al
+contesto dello \textit{stack} usato per il salto non locale. Se così si è
+fatto la maschera dei segnali verrà ripristinata in una successiva chiamata a
+\func{siglongjmp}. Quest'ultima, a parte l'uso di un valore di \param{env} di
+tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
+
+
+% TODO: se e quando si troverà un argomento adeguato inserire altre funzioni
+% sparse attinenti ai segnali, al momento sono note solo:
+% * sigreturn (funzione interna, scarsamente interessante)
+% argomento a priorità IDLE (fare quando non resta niente altro da trattare)
+
+
+\subsection{I \textit{pidfd} e l'invio di segnali \textit{race-free}}
+\label{sec:sig_pid_fd}
+
+
+% TODO: trattare (qui? oppure sopra in "Ulteriori funzioni di gestione?)
+% pidfd_send_signal() introdotta con il kernel 5.1 vedi
+% https://lwn.net/Articles/784831/, https://lwn.net/Articles/773459/ e
+% https://lwn.net/Articles/801319/
+
+% TODO: Nuova subsection sui pidfd, e le funzioni correlate, in particolare:
+% trattare pidfd_send_signal, aggiunta con il kernel 5.1 (vedi
+% https://lwn.net/Articles/783052/) per mandare segnali a processi senza dover
+% usare un PID, vedi anche https://lwn.net/Articles/773459/,
+% https://git.kernel.org/linus/3eb39f47934f trattare pure pidfd_open() (vedi
+% https://lwn.net/Articles/789023/) per ottere un pid fd pollabile aggiunta
+% con il kernel 5.3 ed il nuovo flag PIDFD_NONBLOCK aggionto con il 5.10 (vedi
+% https://git.kernel.org/linus/4da9af0014b5), man pidfd_send_signal su le
+% versioni più recenti della man pages trattare pidfd_getfd aggiunta con il
+% kernel 5.6
+
+
+% LocalWords: kernel POSIX timer shell control ctrl kill raise signal handler
+% LocalWords: reliable unreliable fig race condition sez struct process table
+% LocalWords: delivered pending scheduler sigpending l'I suspend SIGKILL wait
+% LocalWords: SIGSTOP sigaction waitpid dump stack debugger nell'header NSIG
+% LocalWords: tab BSD SUSv SIGHUP PL Hangup SIGINT Interrupt SIGQUIT Quit AEF
+% LocalWords: SIGILL SIGABRT abort SIGFPE SIGSEGV SIGPIPE SIGALRM alarm SIGUSR
+% LocalWords: SIGTERM SIGCHLD SIGCONT SIGTSTP SIGTTIN SIGTTOU SIGBUS bad SL of
+% LocalWords: memory access SIGPOLL Pollable event Sys SIGIO SIGPROF profiling
+% LocalWords: SIGSYS SVID SIGTRAP breakpoint SIGURG urgent socket Virtual IOT
+% LocalWords: clock SIGXCPU SIGXFSZ SIGIOT trap SIGEMT SIGSTKFLT SIGCLD SIGPWR
+% LocalWords: SIGINFO SIGLOST lock NFS SIGWINCH Sun SIGUNUSED fault point heap
+% LocalWords: exception l'overflow illegal instruction overflow segment error
+% LocalWords: violation system call interrupt INTR hang SIGVTALRM virtual SUSP
+% LocalWords: profilazione fcntl descriptor sleep interactive Broken FIFO lost
+% LocalWords: EPIPE Resource advisory client limit exceeded size window change
+% LocalWords: strsignal psignal SOURCE strerror string char int signum perror
+% LocalWords: void sig const sys siglist L'array decr fork exec DFL IGN ioctl
+% LocalWords: EINTR glibc TEMP FAILURE RETRY expr multitasking SVr sighandler
+% LocalWords: ERR libc bsd sysv XOPEN EINVAL pid errno ESRCH EPERM getpid init
+% LocalWords: killpg pidgrp group unistd unsigned seconds all' setitimer which
+% LocalWords: itimerval value ovalue EFAULT ITIMER it interval timeval ms VIRT
+% LocalWords: getitimer stdlib stream atexit exit usleep long usec nanosleep
+% LocalWords: timespec req rem HZ scheduling SCHED RR SigHand forktest WNOHANG
+% LocalWords: deadlock longjmp setjmp sigset sigemptyset sigfillset sigaddset
+% LocalWords: sigdelset sigismember act oldact restorer mask NOCLDSTOP ONESHOT
+% LocalWords: RESETHAND RESTART NOMASK NODEFER ONSTACK sigcontext union signo
+% LocalWords: siginfo bits uid addr fd inline like blocked atomic sigprocmask
+% LocalWords: how oldset BLOCK UNBLOCK SETMASK sigsuspend sigaltstack malloc
+% LocalWords: SIGSTKSZ MINSIGSTKSZ ss oss ENOMEM flags DISABLE sp setrlimit LB
+% LocalWords: RLIMIT rlim sigsetjmp siglongjmp sigjmp buf env savesigs jmp ptr
+% LocalWords: SIGRTMIN SIGRTMAX sigval sigevent sigqueue EAGAIN sysctl safe tp
+% LocalWords: QUEUE thread sigwait sigwaitinfo sigtimedwait info DEF SLB bind
+% LocalWords: function accept return cfgetispeed cfgetospeed cfsetispeed chdir
+% LocalWords: cfsetospeed chmod chown gettime close connect creat dup execle
+% LocalWords: execve fchmod fchown fdatasync fpathconf fstat fsync ftruncate
+% LocalWords: getegid geteuid getgid getgroups getpeername getpgrp getppid sem
+% LocalWords: getsockname getsockopt getuid listen lseek lstat mkdir mkfifo tv
+% LocalWords: pathconf poll posix pselect read readlink recv recvfrom recvmsg
+% LocalWords: rename rmdir select send sendmsg sendto setgid setpgid setsid
+% LocalWords: setsockopt setuid shutdown sigpause socketpair stat symlink page
+% LocalWords: sysconf tcdrain tcflow tcflush tcgetattr tcgetgrp tcsendbreak
+% LocalWords: tcsetattr tcsetpgrp getoverrun times umask uname unlink utime
+% LocalWords: write sival SIVGTALRM NOCLDWAIT MESGQ ASYNCIO TKILL tkill tgkill
+% LocalWords: ILL ILLOPC ILLOPN ILLADR ILLTRP PRVOPC PRVREG COPROC BADSTK FPE
+% LocalWords: INTDIV INTOVF FLTDIV FLTOVF FLTUND underflow FLTRES FLTINV SEGV
+% LocalWords: FLTSUB MAPERR ACCERR ADRALN ADRERR OBJERR BRKPT CLD EXITED MSG
+% LocalWords: KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigFunc jiffies
+% LocalWords: SEC unsafe sockatmark execl execv faccessat fchmodat fchownat
+% LocalWords: fexecve fstatat futimens linkat mkdirat mkfifoat mknod mknodat
+% LocalWords: openat readlinkat renameat symlinkat unlinkat utimensat utimes
+% LocalWords: LinuxThread NTPL Library clockid evp timerid sigev notify high
+% LocalWords: resolution CONFIG RES patch REALTIME MONOTONIC RAW NTP CPUTIME
+% LocalWords: tick calendar The Epoch list getcpuclockid capability CAP getres
+% LocalWords: ENOSYS pthread ENOENT NULL attribute itimerspec new old ABSTIME
+% LocalWords: epoch multiplexing overrun res lpthread sec nsec curr one shot
+% LocalWords: delete stopped gdb alpha mips emulation locking ppoll epoll PGID
+% LocalWords: pwait msgrcv msgsnd semop semtimedop runnable sigisemptyset HRT
+% LocalWords: sigorset sigandset BOOTTIME Android request remain