Aggiornamento note copyright master
authorSimone Piccardi <piccardi@gnulinux.it>
Wed, 10 Jan 2024 11:18:24 +0000 (12:18 +0100)
committerSimone Piccardi <piccardi@gnulinux.it>
Wed, 10 Jan 2024 11:18:24 +0000 (12:18 +0100)
40 files changed:
build.tex
domandemanpages.txt
errors.tex
fileadv.tex
filedir.tex
fileio.tex
gapil.tex
intro.tex
ipc.tex
listati/Action.c [new file with mode: 0644]
listati/SigAction.c [new file with mode: 0644]
listati/Signal.c
listati/SignalRestart.c
listati/rtsigvalsend.c [new file with mode: 0644]
listati/rtsigvalsend_handl.c [new file with mode: 0644]
listati/siginfo_t.h
macro.tex
netlayer.tex
network.tex
othersock.tex
preambolo.tex
pref.tex
procadv.tex
process.tex
prochand.tex
ringraziamenti.tex
session.tex
signal.tex
sockadv.tex
sockctrl.tex
socket.tex
sources/Gapil.h
sources/SigHand.c
sources/rtsigvalsend.c [new file with mode: 0644]
sources/sigwait.c [new file with mode: 0644]
sources/testsignalcgi.c
system.tex
tcpsock.tex
thread.tex
trasplayer.tex

index cec0b2db85a160121f3e283e6dceb636fba256d1..ad1ba8fbb0cb0755681ce2e0c678e07f03c8ac01 100644 (file)
--- a/build.tex
+++ b/build.tex
@@ -1,6 +1,6 @@
 %% build.tex
 %%
-%% Copyright (C) 1999-2019 Simone Piccardi.  Permission is granted to copy,
+%% Copyright (C) 1999-2024 Simone Piccardi.  Permission is granted to copy,
 %% distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index a06a041f982ff8732232914433c664a92fb2167b..1d2bba85abe679380694c98592b5cff8aa833baf 100644 (file)
@@ -6,3 +6,9 @@ Con readv/writev che fine ha fatto EOPNOTSUPP?
 tee ed il supporto per i socket ?
 
 openat e il supposto problema della race condition.
+
+
+Con sigwait si dice che viene restituito un valore positivo in caso di errore
+ma si elenca soltanto EINVAL, ma se si usa un puntatore non valido, che
+succede? Prima era elencato anche EFAULT, ora no. Dal codice sembrerebbe 
+
index b8b6a8fe264c779d153d257b6eca1367ea817d00..18d618c9bdb433be936efa1354c31ec0297f7a0f 100644 (file)
@@ -1,6 +1,6 @@
 %% errors.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index c3300a6ef277e098005bea38a68695880067874f..1bce388813321f2c7bc72723a9ed5da5eb77ffc9 100644 (file)
@@ -1,6 +1,6 @@
 %% fileadv.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -925,6 +925,7 @@ attuale delle cose è sconsigliabile fare affidamento sul \textit{mandatory
 
 % TODO il supporto è stato reso opzionale nel 4.5, verrà eliminato nel futuro
 % (vedi http://lwn.net/Articles/667210/)
+% è stato eliminato nel 5.15
 
 \itindend{file~locking}
 
@@ -2011,6 +2012,9 @@ questo caso la trattazione di un esempio concreto a quando avremo esaminato in
 dettaglio le caratteristiche dei socket; in particolare si potrà trovare un
 programma che utilizza questa interfaccia in sez.~\ref{sec:TCP_serv_epoll}.
 
+% TODO: trattare epoll_wait2, introdotta con il kernel 5.11 (vedi
+% https://lwn.net/Articles/837816/)
+
 \itindend{epoll}
 
 
@@ -2788,6 +2792,9 @@ definita la macro \macro{\_GNU\_SOURCE} prima di includere \headfile{fcntl.h}.
 
 \itindbeg{file~lease} 
 
+% TODO: questa funzionalità potrebbe essere estesa vedi:
+% https://lwn.net/Articles/796000/ 
+
 La prima di queste funzionalità è quella del cosiddetto \textit{file lease};
 questo è un meccanismo che consente ad un processo, detto \textit{lease
   holder}, di essere notificato quando un altro processo, chiamato a sua volta
@@ -3492,6 +3499,10 @@ raggruppati in un solo evento.
 % http://lwn.net/Articles/343346/ (incluso nel 2.6.36)
 % fanotify_mark() ha FAN_MARK_FILESYSTEM dal 4.20
 % fanotify() ha FAN_OPEN_EXEC dal 4.21/5.0
+% fanotify() ha FAN_REPORT_PIDFD dal 5.14
+% fanotify() ha FAN_FS_ERROR dal 5.16, vedi
+% https://docs.kernel.org/admin-guide/filesystem-monitoring.html 
+% fanotify() ha FAN_RENAME dal 5.17, vedi https://kernelnewbies.org/Linux_5.17
 
 
 \subsection{L'interfaccia POSIX per l'I/O asincrono}
@@ -3883,7 +3894,9 @@ per il campo \var{aio\_sigevent} di \struct{aiocb}.
 
 % TODO trattare la nuova API per l'I/O asincrono (io_uring), introdotta con il
 % kernel 5.1, vedi https://lwn.net/Articles/776703/,
-% https://lwn.net/ml/linux-fsdevel/20190112213011.1439-1-axboe@kernel.dk/ 
+% https://lwn.net/ml/linux-fsdevel/20190112213011.1439-1-axboe@kernel.dk/
+% altre feature correlate:
+% dal 5.11: support for the shutdown(), renameat2(), and unlinkat()
 
 \section{Altre modalità di I/O avanzato}
 \label{sec:file_advanced_io}
@@ -4721,7 +4734,13 @@ caching dei dati.
 % TODO aggiunta MADV_WIPEONFORK dal kernel 4.14 that causes the affected memory
 % region to appear to be full of zeros in the child process after a fork. It
 % differs from the existing MADV_DONTFORK in that the address range will
-% remain valid in the child (dalla notizia in https://lwn.net/Articles/733256/).  
+% remain valid in the child (dalla notizia in
+% https://lwn.net/Articles/733256/).
+% TODO aggiunte MADV_COLD e MADV_PAGEOUT dal kernel 5.4, vedi
+% https://git.kernel.org/linus/9c276cc65a58 e
+% https://git.kernel.org/linus/1a4e58cce84e
+% TODO: aggiunte MADV_POPULATE_READ e MADV_POPULATE_WRITE (vedi
+% https://lwn.net/Articles/861695/) 
 
 \footnotetext{a partire dal kernel 2.6.32 è stato introdotto un meccanismo che
   identifica pagine di memoria identiche e le accorpa in una unica pagina
@@ -5485,7 +5504,7 @@ copiati i puntatori.
 
 
 % TODO trattare qui copy_file_range (vedi http://lwn.net/Articles/659523/),
-% introdotta nel kernel 4.5
+% introdotta nel kernel 4.5, vedi anche https://lwn.net/Articles/846403/
 
 \subsection{Gestione avanzata dell'accesso ai dati dei file}
 \label{sec:file_fadvise}
@@ -5850,8 +5869,16 @@ da fare
 
 % TODO: trattare i file seal, vedi fcntl / F_ADD_SEAL e memfd_create
 
+% TODO: con il kernel 5.14 è stata introdotta la syscall memfd_secret, vedi
+% https://lwn.net/Articles/835342/ https://lwn.net/Articles/812325/
+% https://lwn.net/Articles/865256/
+% https://lwn.net/ml/linux-mm/20210729082900.1581359-1-rppt@kernel.org/ e
+% https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=1507f51255c9 
+
 % TODO trattare qui ioctl_ficlonerange ?
 
+% TODO trattare qui close_range, vedi https://lwn.net/Articles/789023/
+% dal 5.11 aggiunto CLOSE_RANGE_CLOEXEC, https://lwn.net/Articles/837816/ 
 
 
 
index 65772744bf8b02534423526b817c07f620510f3e..96c4b5887318df145cafdc0c2d88466953f85f68 100644 (file)
@@ -1,6 +1,6 @@
 %% filedir.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -1182,6 +1182,9 @@ utilizzati solo in fase di montaggio:
 %  * http://lwn.net/Articles/159077/ e
 %  * Documentation/filesystems/sharedsubtree.txt
 
+% TODO: (bassa priorità) trattare mount_setattr, vedi
+% https://lwn.net/Articles/896255/ 
+
 % TODO: (bassa priorità) non documentati ma presenti in sys/mount.h:
 %       * MS_POSIXACL
 %       * MS_KERNMOUNT
@@ -6262,6 +6265,8 @@ gestione delle quote è \funcd{quotactl}, ed il suo prototipo è:
 \end{funcproto}
 
 % TODO rivedere gli errori
+% TODO aggiungere quotactl_fd introdotta con il kernel 5.14, vedi
+% https://lwn.net/Articles/859679/ 
 
 La funzione richiede che il filesystem sul quale si vuole operare, che deve
 essere specificato con il nome del relativo file di dispositivo nell'argomento
index 3bd9db3a35f5f7178ccaad31f171849d57bd0ae0..59a36147923c8ab77fd33c6d18220159b4fd2e84 100644 (file)
@@ -1,6 +1,6 @@
-s%% fileio.tex (merge fileunix.tex - filestd.tex)
+%% fileio.tex (merge fileunix.tex - filestd.tex)
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -557,6 +557,7 @@ escludere la possibilità di far esistere il file anche in un secondo tempo.
 
 % NOTE: per O_TMPFILE vedi: http://kernelnewbies.org/Linux_3.11
 % https://lwn.net/Articles/558598/ http://lwn.net/Articles/619146/
+% https://lwn.net/Articles/896153/
 
 
 \begin{table}[!htb]
@@ -1847,6 +1848,9 @@ riferimento ad una directory, tranne il caso in cui si sia specificato un
 \textit{pathname} assoluto, nel qual caso, come detto, il valore di
 \param{dirfd} sarà completamente ignorato.
 
+% TODO: trattare openat2, introdotta con il kernel 5.6, vedi
+% https://lwn.net/Articles/796868/ e https://git.kernel.org/linus/b55eef872a96
+
 \begin{table}[htb]
   \centering
   \footnotesize
@@ -1956,6 +1960,9 @@ aggiuntivo sono \textit{system call}, ad esempio \func{faccessat} e
 aderenza allo standard POSIX.1-2008, dato che la \textit{system call}
 sottostante non prevede l'argomento \param{flags}.
 
+% TODO: nel kernel 6.6 è stata introdotta fchmodat2 che risolve il problema
+% appena illustrato
+
 % TODO: aggiornare per via di faccessat2 aggiunta con il kernel 5.8
 
 In tab.~\ref{tab:at-functions_constant_values} si sono elencati i valori
@@ -1971,6 +1978,9 @@ perché non avrebbe molto senso cambiare i permessi di un link simbolico) e
 pertanto l'uso della funzione è analogo a quello delle altre funzioni che non
 hanno l'argomento \param{flags} (e non la tratteremo esplicitamente).
 
+% TODO: documentare l'introduzione di fchmodat4() se e quando ci sarà, vedi
+% https://lwn.net/Articles/792628/ 
+
 L'altro flag comune è \const{AT\_EMPTY\_PATH}, utilizzabile a partire dal
 kernel 2.6.39, che consente di usare per \param{dirfd} un file descriptor
 associato ad un file qualunque e non necessariamente ad una directory; in
index 4439b5bc871f2814507fddc398c3c268873a9c1e..81c00c5710e7db0500a76309666938b322a218ad 100644 (file)
--- a/gapil.tex
+++ b/gapil.tex
@@ -1,6 +1,6 @@
 %% gapil.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.3 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -136,7 +136,7 @@ hyperfootnotes=false]{hyperref}
 
 \begin{quote}
   
-  Copyright \copyright\ 2000-2019 Simone Piccardi.  Permission is granted to
+  Copyright \copyright\ 2000-2024 Simone Piccardi.  Permission is granted to
   copy, distribute and/or modify this document under the terms of the GNU Free
   Documentation License, Version 1.3 or any later version published by the
   Free Software Foundation; with the Invariant Sections being ``Un preambolo''
@@ -225,11 +225,17 @@ hyperfootnotes=false]{hyperref}
 \include{ringraziamenti}
 \include{fdl-1.3}
 
-% at the end put the bibliography
+% at the end put index and bibliography
 \backmatter
+\cleardoublepage
+\phantomsection
+\addcontentsline{toc}{chapter}{Indice analitico}
 \printindex
 %\bibliographystyle{phaip}
 %\bibliographystyle{ieeetr}
+\cleardoublepage
+\phantomsection
+\addcontentsline{toc}{chapter}{Bibliografia}
 \bibliographystyle{abstract}
 \bibliography{biblio}
 
index 4059f5ea05c8fadaad46b3b9dc00b00a83e001ef..74091fced6ed3345ec011fdb034788185420a7a6 100644 (file)
--- a/intro.tex
+++ b/intro.tex
@@ -1,6 +1,6 @@
 %% intro.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
diff --git a/ipc.tex b/ipc.tex
index 9e7e459e08ff4c2a508eb2c8d6ff4e2fc3266926..415b2a25f2122d42d469b2475203da6b969317fe 100644 (file)
--- a/ipc.tex
+++ b/ipc.tex
@@ -1,6 +1,6 @@
 %% ipc.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -5029,6 +5029,8 @@ testo alla terminazione di quest'ultimo.
 % https://lwn.net/Articles/178253/, https://lwn.net/Articles/823513/,
 % https://lwn.net/Articles/655044/ 
 
+% TODO: trattare futex_waitv, introdotta con il 5.16, vedi:
+% https://lwn.net/Articles/866112/ 
 
 
 % LocalWords:  like fifo System POSIX RPC Calls Common Object Request Brocker
diff --git a/listati/Action.c b/listati/Action.c
new file mode 100644 (file)
index 0000000..b119244
--- /dev/null
@@ -0,0 +1,15 @@
+inline SigAction * Action(int signo, SigAction *func) 
+{
+    struct sigaction new_handl, old_handl;
+    new_handl.sa_flags=SA_SIGINFO;           /* we use sa_sigaction handler */
+    new_handl.sa_sigaction = func;           /* set signal handler */
+    /* clear signal mask: no signal blocked during execution of func */
+    if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
+        return NULL;
+    }
+    /* change action for signo signal */
+    if (sigaction(signo, &new_handl, &old_handl)){ 
+        return NULL;
+    }
+    return (old_handl.sa_sigaction);
+}
diff --git a/listati/SigAction.c b/listati/SigAction.c
new file mode 100644 (file)
index 0000000..adfbec2
--- /dev/null
@@ -0,0 +1 @@
+typedef void SigAction(int, siginfo_t *, void *);
index 855faa0356557b73568da11909992a41404bdc76..4ba6fae7c7ee0ad5889c682ef0a3024cedff528e 100644 (file)
@@ -1,13 +1,13 @@
-typedef void SigFunc(int);
-inline SigFunc * Signal(int signo, SigFunc *func) 
+typedef void SigHandler(int);
+inline SigHandler * Signal(int signo, SigHandler *func) 
 {
     struct sigaction new_handl, old_handl;
+    new_handl.sa_flags=0;                    /* init to 0 all flags */
     new_handl.sa_handler = func;
     /* clear signal mask: no signal blocked during execution of func */
     if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
         return SIG_ERR;
     }
-    new_handl.sa_flags=0;                    /* init to 0 all flags */
     /* change action for signo signal */
     if (sigaction(signo, &new_handl, &old_handl)){ 
         return SIG_ERR;
index 89bc502e876377784e2ae5df743d48ea361ae4db..faa3904b6792f93207d428fea29711fdb98e4c8c 100644 (file)
@@ -1,8 +1,8 @@
-inline SigFunc * SignalRestart(int signo, SigFunc *func) 
+inline SigHandler * SignalRestart(int signo, SigHandler *func) 
 {
     struct sigaction new_handl, old_handl;
-    new_handl.sa_handler = func;             /* set signal handler */
     new_handl.sa_flags = SA_RESTART;         /* restart system call */
+    new_handl.sa_handler = func;             /* set signal handler */
     /* clear signal mask: no signal blocked during execution of func */
     if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
         return SIG_ERR;
diff --git a/listati/rtsigvalsend.c b/listati/rtsigvalsend.c
new file mode 100644 (file)
index 0000000..9689734
--- /dev/null
@@ -0,0 +1,28 @@
+int main(int argc, char *argv[], char *envp[])
+{
+    char buffer[MAXLINE+1];
+    int nread;
+    sigval_t value;
+    int signo = SIGRTMIN+1;
+
+    struct sigaction new_handl, old_handl;
+    sigemptyset(&new_handl.sa_mask);
+    new_handl.sa_sigaction = sig_handler;
+    new_handl.sa_flags=SA_SIGINFO;
+    /* change action for signo signal */
+    sigaction(signo, &new_handl, &old_handl);
+    while (1) {
+       nread = read(STDIN_FILENO, buffer, MAXLINE);
+       if (nread < 0) {
+           printf("Errore in lettura: %s\n", strerror(errno));
+            return 0;
+       }
+       buffer[nread]=0;
+       value.sival_int = strtol(buffer, NULL, 10);
+       if (value.sival_int > 0) {
+           sigqueue(getpid(), signo, value);
+       } else {
+           printf("Ignoring invalid input\n");
+       }
+    }
+}
diff --git a/listati/rtsigvalsend_handl.c b/listati/rtsigvalsend_handl.c
new file mode 100644 (file)
index 0000000..a58e0be
--- /dev/null
@@ -0,0 +1,6 @@
+void sig_handler(int signum, siginfo_t *info, void *ucontext) {
+    printf("Signal %d\n", signum);
+    printf("From pid %d\n", info->si_pid);
+    printf("From user %d\n", info->si_uid);
+    printf("Value %d\n", info->si_value.sival_int);
+}
index 3e9b488f61e38bbd0fd5f6e2dc4cc5fb85b59b82..a010075801d59baf2aaa32663fda7b1005684ee9 100644 (file)
@@ -17,11 +17,11 @@ siginfo_t {
     void *   si_addr;    /* Memory location which caused fault */
     long     si_band;    /* Band event (was int before glibc 2.3.2) */
     int      si_fd;      /* File descriptor */
-    short    si_addr_lsb;/* Least significant bit of address (since Linux 2.6.32) */
-    void    *si_lower;   /* Lower bound when address violation occurred (since Linux 3.19) */
-    void    *si_upper;   /* Upper bound when address violation occurred (since Linux 3.19) */
-    int      si_pkey;    /* Protection key on PTE that caused fault (since Linux 4.6) */
-    void    *si_call_addr; /* Address of system call instruction (since Linux 3.5) */
-    int      si_syscall; /* Number of attempted system call (since Linux 3.5) */
-    unsigned int si_arch;/* Architecture of attempted system call  (since Linux 3.5) */
- }
+    short    si_addr_lsb;/* Least significant bit of address (since 2.6.32) */
+    void    *si_lower;   /* Lower bound when addr violation occurred (3.19) */
+    void    *si_upper;   /* Upper bound when addr violation occurred (3.19) */
+    int      si_pkey;    /* Protection key on PTE that caused fault (4.6) */
+    void    *si_call_addr; /* Address of system call instruction (3.5) */
+    int      si_syscall; /* Number of attempted system call (since 3.5) */
+    unsigned int si_arch;/* Architecture of attempted system call (3.5) */
+}
index 3cd6b92c643399c7d855f5fe027b06e0b58ecee8..9ede6c45c976b73da9cc27a44c423c1aaa0e27db 100644 (file)
--- a/macro.tex
+++ b/macro.tex
@@ -1,6 +1,6 @@
 %% macro.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 4ed5260559a9e947dcdc98a597731c35566238cc..275b00d8841899e2bfcfcd9e13352d4fd910ab4b 100644 (file)
@@ -1,6 +1,6 @@
 %% netlayer.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index dde8230c6171e0e27670efe095c373c0007cfb11..7672423021e3da133f8bb854f6d5b73caf557937 100644 (file)
@@ -1,6 +1,6 @@
 %% network.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 325fb0d02745c2c674e6c05fbb35ca8d840c2ced..0f7b66572180e86d9b9e8d8b6b4851386cb01b3f 100644 (file)
@@ -1,6 +1,6 @@
 %% othersock.tex
 %%
-%% Copyright (C) 2004-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -801,6 +801,8 @@ stack dei protocolli.
 \subsection{I socket \textit{netlink}}
 \label{sec:socket_netlink}
 
+Vedi \url{https://docs.kernel.org/next/userspace-api/netlink/index.html} 
+
 
 \subsection{I \textit{packet socket}}
 \label{sec:packet_socket}
index 522eb139567002e742158b37fc13f42d96a48c10..0d51e0e9319145b54e13ac79bdaca7bafa8b0a4d 100644 (file)
@@ -1,6 +1,6 @@
 %% preambolo.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 4659e921032acbbe55cc55a15e8e3084534d65af..03e134f9206956edff693ab2c0bd8ee9dd2da2e4 100644 (file)
--- a/pref.tex
+++ b/pref.tex
@@ -1,6 +1,6 @@
 %% pref.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index fe057f85ad8a77c3051b7fd536cd37af8e4d15cb..d8314d74997475b4aff480c3cac122565b488d2a 100644 (file)
@@ -573,7 +573,8 @@ opportuno dettagliare maggiormente.
 \end{table}
 
 % TODO: verificare ed aggiungere le nuove capacità CAP_BPF, CAP_PERFMON, vedi
-% https://lwn.net/Articles/822362/ 
+% https://lwn.net/Articles/822362/ anche CAP_CHECKPOINT_RESTORE vedi
+% https://lwn.net/Articles/822362/ e https://git.kernel.org/linus/74858abbb103
 
 \constbeg{CAP\_SETPCAP}
 
@@ -1321,8 +1322,6 @@ funzione.
 
 
 
-
-
 \subsection{La gestione del \textit{Secure Computing}.}
 \label{sec:procadv_seccomp}
 
@@ -1361,6 +1360,10 @@ essere fornito in una forma di codice interpretabile fornito attraverso un
 socket o una \textit{pipe}, creati prima di lanciare il processo che eseguirà
 il codice non fidato. 
 
+% TODO: a partire dal kernel 6.6 è stato introdotto
+% SECCOMP_USER_NOTIF_FD_SYNC_WAKE_UP that indicates that events from the
+% watched process will be handled synchronously; that allows the kernel to
+% schedule the two processes more efficiently (da LWN)
 
 % TODO a partire dal kernel 3.5 è stato introdotto la possibilità di usare un
 % terzo argomento se il secondo è SECCOMP_MODE_FILTER, vedi
@@ -1373,7 +1376,11 @@ il codice non fidato.
 
 % TODO a partire dal kernel 3.17 è stata introdotta la nuova syscall seccomp,
 % vedi http://lwn.net/Articles/600250/ e http://lwn.net/Articles/603321/
+% sempre per seccomp vedi https://lwn.net/Articles/799557/ dal 5.11 supporto
+% per le constant-action bitmaps https://lwn.net/Articles/834785/
 
+% TODO un esempio di uso di seccomp è su
+% https://blog.cloudflare.com/sandboxing-in-linux-with-zero-lines-of-code/
 
 \itindend{secure~computing~mode}
 
@@ -1498,7 +1505,8 @@ alcune opzioni di controllo attivabili via \func{sysctl} o il filesystem
 
 % TODO documentare la syscall getrandom, introdotta con il kernel 3.17, vedi
 % http://lwn.net/Articles/606141/, ed introdotta con le glibc solo con la
-% versione 2.25, vedi https://lwn.net/Articles/711013/
+% versione 2.25 con getentropy, vedi https://lwn.net/Articles/711013/ ed i
+% problemi successivi vedi https://lwn.net/Articles/800509/
 
 %\subsection{La gestione delle chiavi crittografiche}
 %\label{sec:keyctl_management}
@@ -1558,8 +1566,13 @@ all'ordinario valore nullo (dato per implicito).
 
 %TODO: trattare PR_CAP_AMBIENT, dal 4.3
 %TODO: trattare PR_CAP_FP_*, dal 4.0, solo per MIPS
-%TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19
+%TODO: trattare PR_MPX_*_MANAGEMENT, dal 3.19, vedi
+%      https://lwn.net/Articles/582712/ 
 %TODO: trattare PR_*NO_NEW_PRIVS, dal 3.5
+%TODO: trattare il core scheduling dal 5.14, vedi
+%https://lwn.net/Articles/780703/ e https://lwn.net/Articles/861251/
+%TODO: trattare PR_SPEC_L1D_FLUSH vedi https://git.kernel.org/linus/b7fe54f6c2d4
+
 
 \begin{basedescript}{\desclabelwidth{1.5cm}\desclabelstyle{\nextlinelabel}}
 \item[\constd{PR\_CAPBSET\_READ}] Controlla la disponibilità di una delle
@@ -1891,10 +1904,22 @@ Introdotta a partire dal kernel 2.4.21, solo su PowerPC.
 % TODO documentare PR_SPEC_DISABLE_NOEXEC in 5.1, vedi
 % https://lwn.net/Articles/782511/ 
 
+% TODO documentare  PR_SET_IO_FLUSHER in 5.6, vedi
+% https://lwn.net/Articles/811230/
+
+% TODO documentare PR_SET_SYSCALL_USER_DISPATCH in 5.11, vedi
+% https://lwn.net/Articles/826313/
+
+% TODO documentare PR_SET_MDWE in 6.3, vedi
+% https://git.kernel.org/linus/b507808ebce2
+
+
 \label{sec:prctl_operation}
 \end{basedescript}
 
 
+
+
 \subsection{La funzione \func{ptrace}}
 \label{sec:process_ptrace}
 
@@ -2223,7 +2248,10 @@ degli altri gruppi, che costituisce poi quello che viene chiamato un
 
 
 % TODO: trattare userfaultfd, introdotta con il 4.23, vedi
-% http://man7.org/linux/man-pages/man2/userfaultfd.2.html 
+% http://man7.org/linux/man-pages/man2/userfaultfd.2.html,
+% https://lwn.net/Articles/787308/, https://git.kernel.org/linus/57e5d4f278b9,
+% e hardening della stessa (https://lwn.net/Articles/819834/) nel 5.11
+
 
 % TODO: trattare process_vm_readv/process_vm_writev introdotte con il kernel
 % 3.2, vedi http://man7.org/linux/man-pages/man2/process_vm_readv.2.html e i
@@ -2285,6 +2313,9 @@ Da fare
 % vedi anche l'ulteriore opzione "expedited" introdotta con il kernel 4.14
 % (https://lwn.net/Articles/728795/) 
 
+% TODO trattare process_mrelease introdotta con il kernel 5.16, vedi:
+% https://lwn.net/Articles/864184/ 
+
 
 
 %%% Local Variables:
index cb1fa55c6d08085c353b156bc01fab9ba1de09c9..349806e475ddbb3156be7894076773ea0cbd9427 100644 (file)
@@ -1,6 +1,6 @@
 %% process.tex
 %%
-%% Copyright (C) 2000-2019 by Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 by Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -1781,6 +1781,7 @@ controllo non è possibile per non aver chiamato \func{mcheck} in tempo.
 % TODO: trattare le altre funzionalità avanzate di \func{malloc}, mallopt,
 % mtrace, muntrace, mallinfo e gli hook con le glibc 2.10 c'è pure malloc_info
 % a sostituire mallinfo, vedi http://udrepper.livejournal.com/20948.html
+% per mallopt e realtime vedi https://lwn.net/Articles/837019/
 
 
 \section{Argomenti, ambiente ed altre proprietà di un processo}
index 3ee2344c9195736428b2f5535815f6d353e8d751..e02f0fd6a917d25c302ec1757b0c2772d1a1fd38 100644 (file)
@@ -1,6 +1,6 @@
 %% prochand.tex
 %%
-%% Copyright (C) 2000-2019 by Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 by Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 6d4e77e1b06faef75afb2016de2a1ecfcf3acecd..c5c75df351fd3621daa39a4b32813492837d2f6d 100644 (file)
@@ -1,6 +1,6 @@
 %% ringraziamenti.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 639cf0dd90d7892a921f4737fcd7f647ef20d3d3..beb46bbe9bd6323e69ff37d04cfb605d0bd05193 100644 (file)
@@ -1,6 +1,6 @@
 %% session.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -44,9 +44,9 @@ Originariamente si trattava di dispositivi specifici (i terminali seriali, se
 non addirittura le telescriventi). Oggi questa interfaccia viene in genere
 emulata o tramite programmi o con le cosiddette console virtuali associate a
 monitor e tastiera, ma esiste sempre la possibilità di associarla direttamente
-ad alcuni dispositivi, come eventuali linee seriali, ed in certi casi, come
-buona parte dei dispositivi embedded su cui gira Linux (come router, access
-point, ecc.) questa resta anche l'unica opzione per una \textit{console} di
+a dispositivi specifici lelinee seriali, che in certi casi, come avviene per
+buona parte dei dispositivi embedded su cui gira Linux come router, access
+point, ecc. sono l'unica opzione per una avere una \textit{console} di
 sistema.
 
 
@@ -64,7 +64,7 @@ molti terminali in contemporanea da una singola postazione di lavoro, ma il
 sistema è nato prima dell'esistenza di tutto ciò.
 
 Il \textit{job control} è una caratteristica opzionale, introdotta in BSD
-negli anni '80, e successivamente standardizzata da POSIX.1. La sua
+negli anni '80, e successivamente standardizzata da POSIX.1; la sua
 disponibilità nel sistema è verificabile attraverso il controllo della macro
 \macro{\_POSIX\_JOB\_CONTROL}. In generale il \textit{job control} richiede il
 supporto sia da parte della shell (quasi tutte ormai lo hanno), che da parte
@@ -562,7 +562,7 @@ terminati.
 L'organizzazione del sistema del job control è strettamente connessa alle
 modalità con cui un utente accede al sistema per dare comandi, collegandosi ad
 esso con un terminale, che sia questo realmente tale, come un VT100 collegato
-ad una seriale o virtuale, come quelli associati a schermo e tastiera o ad una
+ad una seriale, o virtuale, come quelli associati a schermo e tastiera o ad una
 connessione di rete. Dato che i concetti base sono gli stessi, e dato che alla
 fine le differenze sono nel dispositivo cui il kernel associa i file standard
 (vedi tab.~\ref{tab:file_std_files}) per l'I/O, tratteremo solo il caso
@@ -695,12 +695,12 @@ Questi programmi, che devono essere eseguiti in modalità non interattiva e
 senza nessun intervento dell'utente, sono normalmente chiamati
 \textsl{demoni}, (o \textit{daemons}), nome ispirato dagli omonimi spiritelli
 della mitologia greca che svolgevano compiti che gli dei trovavano noiosi, di
-cui parla anche Socrate (che sosteneva di averne uno al suo servizio).
+cui parla anche Socrate, che sosteneva di averne uno al suo servizio.
 
 %TODO ricontrollare, i miei ricordi di filosofia sono piuttosto datati.
 
 Se però si lancia un programma demone dalla riga di comando in un sistema che
-supporta, come Linux, il \textit{job control} esso verrà comunque associato ad
+supporta il \textit{job control} come Linux, esso verrà comunque associato ad
 un terminale di controllo e mantenuto all'interno di una sessione, e anche se
 può essere mandato in background e non eseguire più nessun I/O su terminale,
 si avranno comunque tutte le conseguenze che abbiamo trattato in
@@ -823,7 +823,7 @@ differenti meccanismi come:
 le modalità con cui queste azioni vengono realizzate dipendono ovviamente dal
 demone che si usa, per la gestione del quale si rimanda ad un testo di
 amministrazione di sistema.\footnote{l'argomento è ad esempio coperto dal
-  capitolo 3.2.3 si \cite{AGL}.}
+  capitolo 3.2.3 di \cite{AGL}.}
 
 La \acr{glibc} definisce una serie di funzioni standard con cui un processo
 può accedere in maniera generica al servizio di \textit{syslog}, che però
@@ -1270,9 +1270,9 @@ al di fuori di questo.
 \label{sec:sess_terminal_io}
 
 Benché come ogni altro dispositivo i terminali siano accessibili come file,
-essi hanno assunto storicamente, essendo stati a lungo l'unico modo di
-accedere al sistema, una loro rilevanza specifica, che abbiamo già avuto modo
-di incontrare nella precedente sezione.
+essendo stati a lungo l'unico modo di accedere al sistema essi hanno assunto
+storicamente una loro rilevanza specifica, che abbiamo già avuto modo di
+incontrare nella precedente sezione.
 
 Esamineremo qui le peculiarità dell'I/O eseguito sui terminali, che per la
 loro particolare natura presenta delle differenze rispetto ai normali file su
index 8159d3f0a3904e8c8ebe10fbab7cf39efc292f92..7b6cb8eeec6f529d1822d23da12ef0c6b81a500d 100644 (file)
@@ -1,6 +1,6 @@
 %% signal.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
@@ -2126,7 +2126,7 @@ tab.~\ref{tab:sig_sa_flag}.
                             call} quando vengono interrotte dal suddetto
                             segnale, riproduce cioè il comportamento standard
                             di BSD.\\ 
-    \constd{SA\_RESTORER} & Ad uso delle implementazioni delle liberie del C,
+    \constd{SA\_RESTORER} & Ad uso delle implementazioni delle librerie del C,
                             non deve essere usato nelle applicazioni, serve ad
                             indicare che il campo \var{sa\_restorer} contiene
                             l'indirizzo di un cosiddetto \textit{signal
@@ -2155,19 +2155,20 @@ di utilizzare due forme diverse di gestore,\footnote{la possibilità è prevista
   sez.~\ref{sec:sig_real_time}); in precedenza era possibile ottenere alcune
   informazioni addizionali usando \var{sa\_handler} con un secondo parametro
   addizionale di tipo \var{sigcontext}, che adesso è deprecato.}  da
-specificare, a seconda dell'uso o meno del flag \const{SA\_SIGINFO},
-rispettivamente attraverso i campi \var{sa\_sigaction} o \var{sa\_handler}.
-Quest'ultima è quella classica usata anche con \func{signal}, mentre la prima
-permette di usare un gestore più complesso, in grado di ricevere informazioni
-più dettagliate dal sistema, attraverso la struttura \struct{siginfo\_t},
-riportata in fig.~\ref{fig:sig_siginfo_t}.  I due campi devono essere usati in
-maniera alternativa, in certe implementazioni questi campi vengono addirittura
+specificare rispettivamente attraverso i campi \var{sa\_sigaction} o
+\var{sa\_handler}, a seconda dell'uso o meno del flag \const{SA\_SIGINFO}.  La
+forma con \var{sa\_handler} è quella classica usata anche con \func{signal},
+mentre quella con \var{sa\_sigaction} permette di usare un gestore più
+complesso, in grado di ricevere informazioni più dettagliate dal sistema
+attraverso la struttura \struct{siginfo\_t}, riportata in
+fig.~\ref{fig:sig_siginfo_t}.  I due campi devono essere usati in maniera
+alternativa, in certe implementazioni questi campi vengono addirittura
 definiti come una \direct{union}.\footnote{la direttiva \direct{union} del
-  linguaggio C definisce una variabile complessa, analoga a una stuttura, i
+  linguaggio C definisce una variabile complessa, analoga a una struttura, i
   cui campi indicano i diversi tipi di valori che possono essere salvati, in
   maniera alternativa, all'interno della stessa.}
 
-Installando un gestore di tipo \var{sa\_sigaction} diventa allora possibile
+Installando un gestore di tipo \var{sa\_sigaction} diventa possibile
 accedere alle informazioni restituite attraverso il puntatore a questa
 struttura. Tutti i segnali impostano i campi \var{si\_signo}, che riporta il
 numero del segnale ricevuto, \var{si\_errno}, che riporta, quando diverso da
@@ -2188,15 +2189,16 @@ causato l'emissione del segnale.
 In generale \var{si\_code} contiene, per i segnali generici, per quelli
 \textit{real-time} e per tutti quelli inviati tramite da un processo con
 \func{kill} o affini, le informazioni circa l'origine del segnale stesso, ad
-esempio se generato dal kernel, da un timer, da \func{kill}, ecc. Il valore
-viene sempre espresso come una costante,\footnote{le definizioni di tutti i
-  valori possibili si trovano in \file{bits/siginfo.h}.} ed i valori possibili
-in questo caso sono riportati in tab.~\ref{tab:sig_si_code_generic}.
+esempio se generato dal kernel, da un timer, da \func{kill}, ecc. Il valore di
+\var{si\_code} viene sempre espresso come una costante,\footnote{le
+  definizioni di tutti i valori possibili si trovano in
+  \file{bits/siginfo.h}.} ed i valori possibili in questo caso sono riportati
+in tab.~\ref{tab:sig_si_code_generic}.
 
 \begin{table}[!htb]
   \footnotesize
   \centering
-  \begin{tabular}[c]{|l|p{10cm}|}
+  \begin{tabular}[c]{|l|p{8cm}|}
     \hline
     \textbf{Valore} & \textbf{Significato} \\
     \hline
@@ -2234,19 +2236,12 @@ istruzione illecita o di violazione di memoria; mentre alcuni segnali di
 controllo (\signal{SIGCHLD}, \signal{SIGTRAP} e \signal{SIGPOLL}) forniscono
 altre informazioni specifiche.
 
-
 In questo caso il valore del campo \var{si\_code} deve essere verificato nei
 confronti delle diverse costanti previste per ciascuno di detti segnali; dato
 che si tratta di costanti, e non di una maschera binaria, i valori numerici
 vengono riutilizzati e ciascuno di essi avrà un significato diverso a seconda
 del segnale a cui è associato. 
 
-L'elenco dettagliato dei nomi di queste costanti è riportato nelle diverse
-sezioni di tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella
-sequenza in cui si sono appena citati i rispettivi segnali, il prefisso del
-nome indica comunque in maniera diretta il segnale a cui le costanti fanno
-riferimento.
-
 \begin{table}[!htb]
   \footnotesize
   \centering
@@ -2275,20 +2270,34 @@ riferimento.
     \hline
     \constd{SEGV\_MAPERR} & Indirizzo non mappato.\\
     \constd{SEGV\_ACCERR} & Permessi non validi per l'indirizzo.\\
+    \constd{SEGV\_BNDERR} & Controllo sui limiti di accesso (via MPX) fallito
+                            (dal 3.19).\\
+    \constd{SEGV\_PKUERR} & Accesso negato da una protezione della memoria,
+                            vedi sez.~\ref{sec:procadv_security_misc} (dal
+                            4.6).\\
     \hline
     \constd{BUS\_ADRALN}  & Allineamento dell'indirizzo non valido.\\
     \constd{BUS\_ADRERR}  & Indirizzo fisico inesistente.\\
-    \constd{BUS\_OBJERR}  & Errore hardware sull'indirizzo.\\
+    \constd{BUS\_OBJERR}  & Errore hardware specifico sull'indirizzo.\\
+    \constd{BUS\_MCEERR\_AR}& Rilevata corruzione sulla memoria utilizzata
+                              direttamente dal processo è richiesta un'azione.\\
+    \constd{BUS\_MCEERR\_AO}& Rilevata corruzione sulla memoria su memoria non
+                              utilizzata direttamente dal processo, l'azione
+                              è opzionale.\\ 
+    % https://lore.kernel.org/patchwork/patch/158250/
     \hline
     \constd{TRAP\_BRKPT}  & Breakpoint sul processo.\\
     \constd{TRAP\_TRACE}  & Trappola di tracciamento del processo.\\
+    \constd{TRAP\_BRANCH}  & Il processo ha preso una branch trap.\\
+    % https://stackoverflow.com/questions/45895234/what-is-process-branch-trap
+    \constd{TRAP\_HWBKPT}  & Breakpoint/watchpoint hardware.\\
     \hline
     \constd{CLD\_EXITED}  & Il figlio è uscito.\\
     \constd{CLD\_KILLED}  & Il figlio è stato terminato.\\
     \constd{CLD\_DUMPED}  & Il figlio è terminato in modo anormale.\\
     \constd{CLD\_TRAPPED} & Un figlio tracciato ha raggiunto una trappola.\\
     \constd{CLD\_STOPPED} & Il figlio è stato fermato.\\
-    \constd{CLD\_CONTINUED}& Il figlio è ripartito.\\
+    \constd{CLD\_CONTINUED}& Il figlio è ripartito (dal 2.6.9).\\
     \hline
     \constd{POLL\_IN}   & Disponibili dati in ingresso.\\
     \constd{POLL\_OUT}  & Spazio disponibile sul buffer di uscita.\\
@@ -2297,14 +2306,23 @@ riferimento.
     \constd{POLL\_PRI}  & Disponibili dati di alta priorità in ingresso.\\
     \constd{POLL\_HUP}  & Il dispositivo è stato disconnesso.\\
     \hline
+    \constd{SYS\_SECCOMP}& Innescato da una regola di \func{seccomp}, vedi
+                           sez.~\ref{sec:procadv_seccomp} (dal 3.5).\\
+    \hline
   \end{tabular}
   \caption{Valori del campo \var{si\_code} della struttura \struct{sigaction}
     impostati rispettivamente dai segnali \signal{SIGILL}, \signal{SIGFPE},
-    \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP} e
-    \signal{SIGPOLL}/\signal{SIGIO}.}
+    \signal{SIGSEGV}, \signal{SIGBUS}, \signal{SIGCHLD}, \signal{SIGTRAP}
+    \signal{SIGPOLL}/\signal{SIGIO} e \signal{SIGSYS}.}
   \label{tab:sig_si_code_special}
 \end{table}
 
+L'elenco dettagliato dei nomi di queste costanti è riportato nelle diverse
+sezioni di tab.~\ref{tab:sig_si_code_special} che sono state ordinate nella
+sequenza in cui si sono appena citati i rispettivi segnali, il prefisso del
+nome indica comunque in maniera diretta il segnale a cui le costanti fanno
+riferimento.
+
 Il resto della struttura \struct{siginfo\_t} è definito come una \dirct{union}
 ed i valori eventualmente presenti dipendono dal segnale ricevuto, così
 \signal{SIGCHLD} ed i segnali \textit{real-time} (vedi
@@ -2326,18 +2344,19 @@ Benché sia possibile usare nello stesso programma sia \func{sigaction} che
 \func{signal} occorre molta attenzione, in quanto le due funzioni possono
 interagire in maniera anomala. Infatti l'azione specificata con
 \struct{sigaction} contiene un maggior numero di informazioni rispetto al
-semplice indirizzo del gestore restituito da \func{signal}.  Per questo motivo
-se si usa quest'ultima per installare un gestore sostituendone uno
+semplice indirizzo del gestore restituito da \func{signal}, e questo comporta
+che se si usa quest'ultima per installare un gestore sostituendone uno
 precedentemente installato con \func{sigaction}, non sarà possibile effettuare
 un ripristino corretto dello stesso.
 
-Per questo è sempre opportuno usare \func{sigaction}, che è in grado di
+Per questo motivo è opportuno usare sempre \func{sigaction} che è in grado di
 ripristinare correttamente un gestore precedente, anche se questo è stato
 installato con \func{signal}. In generale poi non è il caso di usare il valore
 di ritorno di \func{signal} come campo \var{sa\_handler}, o viceversa, dato
-che in certi sistemi questi possono essere diversi. In definitiva dunque, a
-meno che non si sia vincolati all'aderenza stretta allo standard ISO C, è
-sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}.
+che in certi sistemi questi valori possono essere diversi. In definitiva
+dunque, a meno che non si sia vincolati all'aderenza stretta allo standard ISO
+C, è sempre il caso di evitare l'uso di \func{signal} a favore di
+\func{sigaction}.
 
 \begin{figure}[!htbp]
   \footnotesize  \centering
@@ -2350,14 +2369,14 @@ sempre il caso di evitare l'uso di \func{signal} a favore di \func{sigaction}.
   \label{fig:sig_Signal_code}
 \end{figure}
 
-Per questo motivo si è provveduto, per mantenere un'interfaccia semplificata
-che abbia le stesse caratteristiche di \func{signal}, a definire attraverso
-\func{sigaction} una funzione equivalente \func{Signal}, il cui codice è
-riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si trova nel
-file \file{SigHand.c} nei sorgenti allegati). Anche in questo caso, per
-semplificare la definizione si è poi definito un apposito tipo
-\texttt{SigFunc} per esprimere in modo più comprensibile la forma di un
-gestore di segnale.
+Come primo esmpio si è allora provveduto, per mantenere un'interfaccia
+semplificata che abbia le stesse caratteristiche di \func{signal}, a definire
+attraverso \func{sigaction} una funzione equivalente, \func{Signal}, il cui
+codice è riportato in fig.~\ref{fig:sig_Signal_code} (il codice completo si
+trova nel file \file{SigHand.c} nei sorgenti allegati). Anche in questo caso,
+per semplificare la definizione si è poi definito un apposito tipo
+\texttt{SigHandler} per esprimere in modo più semplice la forma di un gestore
+di segnale.
 
 Si noti come, essendo la funzione estremamente semplice, essa è definita come
 \dirct{inline}. Questa direttiva viene usata per dire al compilatore di
@@ -2374,8 +2393,74 @@ In tal caso infatti le istruzioni per creare un nuovo frame nello
 del codice, appesantendo inutilmente il programma.  Originariamente questo
 comportamento veniva ottenuto con delle macro, ma queste hanno tutta una serie
 di problemi di sintassi nel passaggio degli argomenti (si veda ad esempio
-\cite{PratC}) che in questo modo possono essere evitati.
+\cite{PratC}) che in questo modo possono essere evitati. 
+
+La funzione \func{Signal} appena illustrata continua però ad utilizzare la
+forma tradizionale del gestore di segnali, mentre abbiamo visto come
+\func{sigaction} preveda la possibilità di indicare, attivando il flag
+\const{SA\_SIGINFO}, un gestore nella forma avanzata \param{sa\_sigaction}, in
+grado di ricevere molte più informazioni, che prevede l'utilizzo di tre
+argomenti. Di nuovo facciamo un esempio di come usare \func{sigaction} in
+questo caso, partendo col definire un apposito tipo, \texttt{SigAction}, per
+semplificare l'indicazione del nuovo tipo di gestore:
+\includecodesnip{listati/SigAction.c}
+
+Un gestore di segnali definito nella forma \val{sa\_sigaction} infatti, oltre
+al numero di segnale ricevuto come primo argomento, otterrà dal kernel un
+puntatore ad una struttura \struct{siginfo\_t} con le relative informazioni
+attienti l'origine del segnale nel secondo argomento, ed infine un puntatore a
+delle informazioni di contesto ad uso delle librerie del C nel terzo
+argomento, che non vengono mai utilizzate nel gestore, attenendo al
+funzionamento a basso livello della gestione dei segnali.\footnote{il kernel
+  tutte le volte che c'è un segnale pendente gestisce l'esecuzione del
+  relativo gestore caricando nello stack i dati del contesto di esecuzione del
+  processo e facendo sì che al ritorno in \textit{user-space} sia eseguito il
+  gestore, una volta che questo ritorna il controllo viene passato a dello
+  specifico codice in \textit{user-space}, detto \itindex{signal~trampoline}
+  \textit{signal trampoline}, che con la funzione di sistema \funcm{sigreturn}
+  usa le informazioni di contesto disponibili in questo argomento per far
+  riprendere l'esecuzione del processo al punto in cui si era stata interrotta
+  dal segnale; tutto ciò è gestito dal kernel e dalle librerie del C e non
+  interessa la programmazione ordinaria.}
+
+Si è riportato in fig.~\ref{fig:sig_Action_code} un equivalente della
+precedente \func{Signal} che però installa un gestore di segnali di tipo
+\param{sa\_sigaction}. Si noti come la funzione, una volta definito come sopra
+il tipo \texttt{SigAction} per il gestore di segnali, sia praticamente
+identica all'altra.
 
+\begin{figure}[!htbp]
+  \footnotesize  \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/Action.c}
+  \end{minipage} 
+  \normalsize 
+  \caption{La funzione \func{Action}, analoga alla precedente \func{Signal}
+    per l'uso dei gestori di segnali avanzati con \func{sigaction}.}
+  \label{fig:sig_Action_code}
+\end{figure}
+
+Quello che cambia in questo caso è occorre indicare (\texttt{\small 4}) nel
+campo \var{sa\_flags} della struttura \struct{sigaction} il valore
+\const{SA\_SIGINFO}, perché poi si passerà (\texttt{\small 5}) l'indirizzo il
+del gestore nel campo \var{sa\_sigaction} invece che in \var{sa\_handler} come
+nel caso precedente.
+
+Inoltre in questo caso, ritornando la funzione l'indirizzo del gestore che è
+nella nuova forma, non si può terminare in caso di errore riportanto il valore
+\const{SIG\_ERR} (che è di tipo \type{sighandler\_t} e fa riferimento ad un
+gestore ordinario) come in precedenza. Per questo motivo si è scelto di
+ritornare come indicazione di errore il valore \val{NULL}, ma in questo caso
+si deve tenere presente che questo valore non è più distinto da quello che si
+utilizza per indicare la eventuale reimpostazione del gestore di default (come
+era \const{SIG\_ERR} rispetto a \const{SIG\_DFL}).
+
+Per questo motivo questa funzione viene illustrata solo a scopo di primo
+esempio, vedremo più avanti, in sez.~\ref{sec:sig_real_time}, nel contesto
+dell'uso dei segnali \textit{real-time} per i quali è nata questa nuova
+interfaccia, un esempio più completo dell'uso di \func{sigaction} con un
+gestore in questa nuova forma, e di come utilizzare le informazioni ottenute
+nella struttura \struct{siginfo\_t}.
 
 
 \subsection{La gestione della \textsl{maschera dei segnali} o 
@@ -2413,10 +2498,22 @@ quando si devono eseguire più operazioni su delle variabili (nell'esempio
 citato un controllo ed una assegnazione) o comunque eseguire una serie di
 istruzioni, l'atomicità non è più possibile.
 
-In questo caso, se si vuole essere sicuri di non poter essere interrotti da un
-segnale durante l'esecuzione di una sezione di codice, lo si può bloccare
-esplicitamente modificando la maschera dei segnali del processo con la
-funzione di sistema \funcd{sigprocmask}, il cui prototipo è:
+In questo caso, quando si vuole essere sicuri di non essere interrotti da uno
+o più segnali durante l'esecuzione di una sezione di codice, diventa
+necessario bloccarli esplicitamente. Questo si fa modificando la maschera dei
+segnali del processo e per fare questa operazione con lo standard POSIX-1.2001
+è stata introdotta una apposita funzione di sistema,
+\funcd{sigprocmask},\footnote{in realtà quello che viene usato normalmente è
+  il \textit{wrapper} omonimo delle \acr{glibc} dato che con l'introduzione
+  dei segnali \textit{real time} nel kernel 2.2 le dimensioni del tipo
+  \type{sigset\_t} sono cambiate e la \textit{system call} sottostante è
+  diventata \funcm{rt\_sigprocmask} che richiede un quarto argomento di tipo
+  \ctyp{size\_t} per indicare questa dimensione; la vecchia funzione di
+  sistema continua ad esistere ma è deprecata, il \textit{wrapper} maschera
+  questi dettagli ed inoltre ignora in maniera silente i tentativi di bloccare
+  i segnali \textit{real time} impiegati per la gestione dei \textit{thread}
+  dalla \textit{Native Thread Posix Library} (vedi
+  sez.~\ref{sec:linux_ntpl}).} il cui prototipo è:
 
 \begin{funcproto}{
 \fhead{signal.h}
@@ -2435,11 +2532,13 @@ funzione di sistema \funcd{sigprocmask}, il cui prototipo è:
 
 La funzione usa l'insieme di segnali posto all'indirizzo passato
 nell'argomento \param{set} per modificare la maschera dei segnali del processo
-corrente. La modifica viene effettuata a seconda del valore
-dell'argomento \param{how}, secondo le modalità specificate in
-tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un valore non nullo
-per \param{oldset} la maschera dei segnali corrente viene salvata a
-quell'indirizzo.
+corrente. La modifica viene effettuata a seconda del valore dell'argomento
+\param{how}, secondo le modalità specificate in
+tab.~\ref{tab:sig_procmask_how}. Qualora si specifichi un indirizzo non nullo
+per il puntatore \param{oldset} la maschera dei segnali corrente viene salvata
+a quell'indirizzo. Se invece è nullo il puntatore \param{set} non viene
+eseguito nessun cambiamento e si può usare la funzione per leggere la maschera
+corrente in \param{oldset}.
 
 \begin{table}[htb]
   \footnotesize
@@ -2463,14 +2562,15 @@ quell'indirizzo.
   \label{tab:sig_procmask_how}
 \end{table}
 
-In questo modo diventa possibile proteggere delle sezioni di codice bloccando
-l'insieme di segnali voluto per poi riabilitarli alla fine della sezione
-critica. La funzione permette di risolvere problemi come quelli mostrati in
-fig.~\ref{fig:sig_event_wrong}, proteggendo la sezione fra il controllo del
-flag e la sua cancellazione.  La funzione può essere usata anche all'interno
-di un gestore, ad esempio per riabilitare la consegna del segnale che l'ha
-invocato, in questo caso però occorre ricordare che qualunque modifica alla
-maschera dei segnali viene perduta al ritorno dallo stesso.
+La funzione consente di proteggere delle sezioni di codice bloccando l'insieme
+di segnali voluto per poi riabilitarli alla fine della sezione critica e
+risolvere problemi come quelli mostrati in fig.~\ref{fig:sig_event_wrong},
+proteggendo la sezione fra il controllo del flag e la sua cancellazione.
+
+La funzione può essere usata anche all'interno di un gestore, ad esempio per
+riabilitare la consegna del segnale che l'ha invocato, in questo caso però
+occorre ricordare che qualunque modifica alla maschera dei segnali viene
+perduta al ritorno dallo stesso.
 
 Benché con l'uso di \func{sigprocmask} si possano risolvere la maggior parte
 dei casi di \textit{race condition} restano aperte alcune possibilità legate
@@ -2478,10 +2578,12 @@ all'uso di \func{pause}.  Il caso è simile a quello del problema illustrato
 nell'esempio di fig.~\ref{fig:sig_sleep_incomplete}, e cioè la possibilità che
 il processo riceva il segnale che si intende usare per uscire dallo stato di
 attesa invocato con \func{pause} immediatamente prima dell'esecuzione di
-quest'ultima. Per poter effettuare atomicamente la modifica della maschera dei
-segnali (di solito attivandone uno specifico) insieme alla sospensione del
-processo lo standard POSIX ha previsto la funzione di sistema
-\funcd{sigsuspend}, il cui prototipo è:
+quest'ultima.
+
+Per poter effettuare atomicamente la modifica della maschera dei segnali (di
+solito attivandone uno specifico) insieme alla sospensione del processo lo
+standard POSIX ha previsto la funzione di sistema \funcd{sigsuspend}, il cui
+prototipo è:
 
 \begin{funcproto}{
 \fhead{signal.h}
@@ -2492,12 +2594,16 @@ processo lo standard POSIX ha previsto la funzione di sistema
 {La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
   caso \var{errno} assumerà uno dei valori: 
   \begin{errlist}
-  \item[\errcode{EFAULT}] si sono specificati indirizzi non validi.
-  \item[\errcode{EINVAL}] si è specificato un numero di segnale invalido.
+  \item[\errcode{EFAULT}] l'indirizzo di \param{mask} non è valido.
+  \item[\errcode{EINTR}] la funzione è stata interrotta da un segnale.
   \end{errlist}
 }
 \end{funcproto}
 
+La funzione imposta la maschera dei segnali indicata da \param{mask} e pone in
+attesa il processo. Ritorna solo con la ricezione di un segnale, con un errore
+di \errval{EINTR}, a meno che il segnale non termini il processo.
+
 Come esempio dell'uso di queste funzioni proviamo a riscrivere un'altra volta
 l'esempio di implementazione di \code{sleep}. Abbiamo accennato in
 sez.~\ref{sec:sig_sigaction} come con \func{sigaction} sia possibile bloccare
@@ -2508,7 +2614,7 @@ della funzione, vediamo allora come usando la nuova interfaccia è possibile
 ottenere un'implementazione, riportata in fig.~\ref{fig:sig_sleep_ok} che non
 presenta neanche questa necessità.
 
-\begin{figure}[!htbp]
+\begin{figure}[!htb]
   \footnotesize \centering
   \begin{minipage}[c]{\codesamplewidth}
     \includecodesample{listati/sleep.c}
@@ -2565,29 +2671,22 @@ principale, cosa che ad esempio può rendere problematico chiamare all'interno
 di un gestore di segnali la stessa funzione che dal segnale è stata
 interrotta.
 
+Ad esempio se consideriamo le funzioni dell'I/O standard di
+sez.~\ref{sec:files_std_interface} è chiaro che essendo basate sull'uso da
+parte delle librerie del C di buffer e puntatori interni, che possono essere
+stati aggiornati in maniera parziale alla ricezione di un segnale, questi
+possono trovarsi, quando riutilizzate all'interno di un gestore, in uno stato
+completamente inconsistente.
+
 \index{funzioni!\textit{signal safe}|(}
 
-Il concetto è comunque più generale e porta ad una distinzione fra quelle che
+Il concetto è comunque generale e porta ad una distinzione fra quelle che
 POSIX chiama \textsl{funzioni insicure} (\textit{signal unsafe function}) e
-\textsl{funzioni sicure} (o più precisamente \textit{signal safe function}).
-Quando un segnale interrompe una funzione insicura ed il gestore chiama al suo
-interno una funzione insicura il sistema può dare luogo ad un comportamento
-indefinito, la cosa non avviene invece per le funzioni sicure.
-
-Tutto questo significa che la funzione che si usa come gestore di segnale deve
-essere programmata con molta cura per evirare questa evenienza e che non è
-possibile utilizzare al suo interno una qualunque funzione di sistema, se si
-vogliono evitare questi problemi si può ricorrere soltanto all'uso delle
-funzioni considerate sicure.
-
-L'elenco delle funzioni considerate sicure varia a seconda della
-implementazione utilizzata e dello standard a cui si fa riferimento. Non è
-riportata una lista specifica delle funzioni sicure per Linux, e si suppone
-pertanto che siano quelle richieste dallo standard. Secondo quanto richiesto
-dallo standard POSIX 1003.1 nella revisione del 2003, le ``\textit{signal safe
-  function}'' che possono essere chiamate anche all'interno di un gestore di
-segnali sono tutte quelle della lista riportata in
-fig.~\ref{fig:sig_safe_functions}.
+\textsl{funzioni sicure} (o più precisamente \textit{signal safe function} o
+funzioni \textit{async-signal-safe}).  Quando un segnale interrompe una
+funzione insicura ed il gestore chiama al suo interno una funzione insicura il
+sistema può dare luogo ad un comportamento indefinito, la cosa non avviene
+invece per le funzioni sicure.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2628,7 +2727,27 @@ fig.~\ref{fig:sig_safe_functions}.
   \label{fig:sig_safe_functions}
 \end{figure}
 
-\index{funzioni!\textit{signal safe}|)}
+Tutto questo significa che la funzione che si usa come gestore di segnale deve
+essere programmata con molta cura per evirare questa evenienza e che non è
+possibile utilizzare al suo interno una qualunque funzione di sistema o di
+libreria. Oltre ovviamente ad essere rientrante rispetto all'uso di eventuali
+variabili globali del programma se si vogliono evitare questi problemi
+all'interno di un gestore di segnali si dovrà ricorrere soltanto all'uso delle
+funzioni considerate sicure.\footnote{in realtà sarebbe possibile adottare
+  come approccio alternativo quello di bloccare i segnali nel programma
+  principale tutte le volte che questo chiama funzioni insicure o utilizza
+  dati globali utilizzati anche dal gestore di segnali per poi riabilitarli
+  una volta finito; la complessità di questo approccio lo rende però
+  sostanzialmente impraticabile, ed effettivamente non impraticato.}
+
+L'elenco delle funzioni considerate sicure varia a seconda della
+implementazione utilizzata e dello standard a cui si fa riferimento. Non è
+riportata una lista specifica delle funzioni di sistema sicure per Linux, e si
+suppone pertanto che siano quelle richieste dallo standard. Secondo quanto
+richiesto dallo standard POSIX 1003.1 nella revisione del 2003, le
+``\textit{signal safe function}'' che possono essere chiamate anche
+all'interno di un gestore di segnali sono tutte quelle della lista riportata
+in fig.~\ref{fig:sig_safe_functions}.
 
 Lo standard POSIX.1-2004 modifica la lista di
 fig.~\ref{fig:sig_safe_functions} aggiungendo le funzioni \func{\_Exit} e
@@ -2650,6 +2769,45 @@ ulteriori funzioni in fig.~\ref{fig:sig_safe_functions_posix_2008}.
   \label{fig:sig_safe_functions_posix_2008}
 \end{figure}
 
+Nella successiva revisione di POSIX.1-2013 sono poi state aggiunte le
+ulteriori funzioni \func{fchdir}, \func{pthread\_kill}, \func{pthread\_self},
+\func{pthread\_sigmask}. L'ultima revisione dello standard alla data della
+scrittura di questa sezione è la POSIX.1-2016,\footnote{una lista più
+  aggiornata può comunque essere ottenuto dalla documentazione di sistema,
+  accessibile con \texttt{man signal-safety}, da cui si sono estratti questi
+  elenchi.} che ha aggiunto alle \textit{signal safe function} le ulteriori
+funzioni di fig.~\ref{fig:sig_safe_functions_posix_2016}.
+
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{14cm}
+    \func{ffs}, \func{htonl}, \func{htons}, \func{longjmp}, \func{memccpy},
+    \func{memchr}, \func{memcmp}, \func{memcpy}, \func{memmove}, \func{memset},
+    \func{siglongjmp}, \func{stpcpy}, \func{stpncpy}, \func{strcat},
+    \func{strchr}, \func{strcmp}, \func{strcpy}, \func{strcspn},
+    \func{strlen}, \func{strncat}, \func{strncmp}, \func{strncpy},
+    \func{strnlen}, \func{strpbrk}, \func{strrchr}, \func{strspn},
+    \func{strstr}, \func{strtok\_r}, \func{wcpcpy}, \func{wcpncpy},
+    \func{wcscat}, \func{wcschr}, \func{wcscmp}, \func{wcscpy},
+    \func{wcscspn}, \func{wcslen}, \func{wcsncat}, \func{wcsncmp},
+    \func{wcsncpy}, \func{wcsnlen}, \func{wcspbrk}, \func{wcsrchr},
+    \func{wcsspn}, \func{wcsstr}, \func{wcstok}, \func{wmemchr},
+    \func{wmemcmp}, \func{wmemcpy}, \func{wmemmove}, \func{wmemset}. 
+  \end{minipage} 
+  \normalsize 
+  \caption{Ulteriori funzioni sicure secondo lo standard POSIX.1-2016.}
+  \label{fig:sig_safe_functions_posix_2016}
+\end{figure}
+
+Rispetto a questi elenchi occorre precisare che prima della versione 2.24
+delle \acr{glibc} l'implementazione delle funzioni \func{execl} ed
+\func{execle} non era sicura, e che tuttora non lo è quella di
+\func{aio\_suspend}. Inoltre è da evitare \func{fork}, che potrebbe essere
+rimossa in future revisioni dello standard, e che già POSIX-1.2003 indicava
+come tale se usata in concorrenza con \func{pthread\_atfork}.
+
+\index{funzioni!\textit{signal safe}|)}
 
 Per questo motivo è opportuno mantenere al minimo indispensabile le operazioni
 effettuate all'interno di un gestore di segnali, qualora si debbano compiere
@@ -2719,52 +2877,58 @@ accessibili in un intervallo di valori specificati dalle due costanti
 \constd{SIGRTMIN} e \constd{SIGRTMAX}, che specificano il numero minimo e
 massimo associato ad un segnale \textit{real-time}.
 
-Su Linux di solito il primo valore è 33, mentre il secondo è \code{\_NSIG-1},
-che di norma (vale a dire sulla piattaforma i386) è 64. Questo dà un totale di
-32 segnali disponibili, contro gli almeno 8 richiesti da POSIX.1b. Si tenga
-presente però che i primi segnali \textit{real-time} disponibili vengono usati
-dalla \acr{glibc} per l'implementazione dei \textit{thread} POSIX (vedi
-sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} viene
-modificato di conseguenza.\footnote{per la precisione vengono usati i primi
-  tre per la vecchia implementazione dei \textit{LinuxThread} ed i primi due
-  per la nuova NTPL (\textit{New Thread Posix Library}), il che comporta che
-  \const{SIGRTMIN} a seconda dei casi può assumere i valori 34 o 35.}
+Su Linux i segnali \textit{real-time} vengono numerati a partire da 32, fino
+ad un valore massimo di 64, per un totale di 33 segnali disponibili, contro
+gli almeno 8 richiesti da POSIX.1b. Si tenga presente però che i primi segnali
+\textit{real-time} disponibili vengono usati dalla \acr{glibc} per
+l'implementazione dei \textit{thread} POSIX (vedi
+sez.~\ref{sec:thread_posix_intro}), ed il valore di \const{SIGRTMIN} fornito
+quando si usano le \acr{glibc} viene modificato di conseguenza.\footnote{per
+  la precisione vengono usati i primi tre per la vecchia implementazione dei
+  \textit{LinuxThread} ed i primi due per la nuova NTPL (\textit{New Thread
+    Posix Library}), il che comporta che \const{SIGRTMIN} a seconda dei casi
+  può assumere i valori 34 o 35.}
 
 Per questo motivo nei programmi che usano i segnali \textit{real-time} non si
-deve mai usare un valore assoluto dato che si correrebbe il rischio di
-utilizzare un segnale in uso alle librerie, ed il numero del segnale deve
-invece essere sempre specificato in forma relativa a \const{SIGRTMIN} (come
-\code{SIGRTMIN + n}) avendo inoltre cura di controllare di non aver mai
-superato \const{SIGRTMAX}.
-
-I segnali con un numero più basso hanno una priorità maggiore e vengono
-consegnati per primi, inoltre i segnali \textit{real-time} non possono
-interrompere l'esecuzione di un gestore di un segnale a priorità più alta; la
-loro azione predefinita è quella di terminare il programma.  I segnali
-ordinari hanno tutti la stessa priorità, che è più alta di quella di qualunque
-segnale \textit{real-time}. Lo standard non definisce niente al riguardo ma
-Linux, come molte altre implementazioni, adotta questa politica.
+deve mai usare un valore numerico assoluto, dato che si potrebbe correre il
+rischio di utilizzare un segnale già in uso alle librerie; il numero del
+segnale deve invece essere sempre specificato in forma relativa a
+\const{SIGRTMIN}, con qualcosa come \code{SIGRTMIN + n}, avendo sempre cura di
+controllare di non aver indicato un valore maggiore di \const{SIGRTMAX}.
+
+I segnali \textit{real-time} con un numero più basso hanno una priorità
+maggiore e vengono consegnati per primi, inoltre i segnali \textit{real-time}
+non possono interrompere l'esecuzione di un gestore di un segnale a priorità
+più alta. La loro azione predefinita è sempre quella di terminare il
+programma.  I segnali ordinari invece hanno tutti la stessa priorità, che è
+più alta di quella di qualunque segnale \textit{real-time}.\footnote{questa è
+  però una caratteristica di Linux, presente comunque anche nella gran parte
+  degli altri kernel \textit{unix-like}, lo standard infatti non definisce
+  niente al riguardo.}
 
 Si tenga presente che questi nuovi segnali non sono associati a nessun evento
-specifico, a meno di non richiedere specificamente il loro utilizzo in
+specifico, a meno di non avere richiesto l'utilizzo di uno di essi in
 meccanismi di notifica come quelli per l'I/O asincrono (vedi
 sez.~\ref{sec:file_asyncronous_io}) o per le code di messaggi POSIX (vedi
-sez.~\ref{sec:ipc_posix_mq}), pertanto devono essere inviati esplicitamente.
+sez.~\ref{sec:ipc_posix_mq}), pertanto nell'uso ordinario devono essere
+inviati esplicitamente.
 
-Inoltre, per poter usufruire della capacità di restituire dei dati, i relativi
-gestori devono essere installati con \func{sigaction}, specificando per
-\var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare la
-forma estesa \var{sa\_sigaction} del gestore (vedi
+Inoltre, per poter usufruire della loro capacità di restituire dei dati, i
+relativi gestori devono essere installati con \func{sigaction}, specificando
+per \var{sa\_flags} la modalità \const{SA\_SIGINFO} che permette di utilizzare
+la forma estesa \var{sa\_sigaction} del gestore (vedi
 sez.~\ref{sec:sig_sigaction}).  In questo modo tutti i segnali
 \textit{real-time} possono restituire al gestore una serie di informazioni
 aggiuntive attraverso l'argomento \struct{siginfo\_t}, la cui definizione è
 stata già vista in fig.~\ref{fig:sig_siginfo_t}, nella trattazione dei gestori
 in forma estesa.
 
-In particolare i campi utilizzati dai segnali \textit{real-time} sono
-\var{si\_pid} e \var{si\_uid} in cui vengono memorizzati rispettivamente il
-\ids{PID} e l'\ids{UID} effettivo del processo che ha inviato il segnale,
-mentre per la restituzione dei dati viene usato il campo \var{si\_value}.
+In particolare i campi di \struct{siginfo\_t} utilizzati dai segnali
+\textit{real-time} sono \var{si\_pid} e \var{si\_uid} in cui vengono riportati
+rispettivamente il \ids{PID} e l'\ids{UID} effettivo del processo che ha
+inviato il segnale, e lo specifico campo \var{si\_value}. Questo campo viene
+indicato in fig.~\ref{fig:sig_siginfo_t} come di tipo \type{sigval\_t}; se ne
+è riportata la definizione in fig.~\ref{fig:sig_sigval}.
 
 \begin{figure}[!htb]
   \footnotesize \centering
@@ -2777,25 +2941,24 @@ mentre per la restituzione dei dati viene usato il campo \var{si\_value}.
   \label{fig:sig_sigval}
 \end{figure}
 
-Detto campo, identificato con il tipo di dato \type{sigval\_t}, è una
-\dirct{union} di tipo \struct{sigval} (la sua definizione è in
-fig.~\ref{fig:sig_sigval}) in cui può essere memorizzato o un valore numerico,
-se usata nella forma \var{sival\_int}, o un puntatore, se usata nella forma
-\var{sival\_ptr}. L'unione viene usata dai segnali \textit{real-time} e da
-vari meccanismi di notifica per restituire dati al gestore del segnale in
-\var{si\_value}. Un campo di tipo \type{sigval\_t} è presente anche nella
-struttura \struct{sigevent} (definita in fig.~\ref{fig:struct_sigevent}) che
-viene usata dai meccanismi di notifica come quelli per i timer POSIX (vedi
-sez.~\ref{sec:sig_timer_adv}), l'I/O asincrono (vedi
-sez.~\ref{sec:file_asyncronous_io}) o le code di messaggi POSIX (vedi
-sez.~\ref{sec:ipc_posix_mq}).
 
-A causa delle loro caratteristiche, la funzione \func{kill} non è adatta ad
-inviare segnali \textit{real-time}, poiché non è in grado di fornire alcun
-valore per il campo \var{si\_value} restituito nella struttura
-\struct{siginfo\_t} prevista da un gestore in forma estesa. Per questo motivo
-lo standard ha previsto una nuova funzione, \funcd{sigqueue}, il cui prototipo
-è:
+Si tratta quindi di una unione \struct{sigval} con due possibili campi
+alternativi in cui può essere memorizzato o un valore numerico, se usata con
+\var{sival\_int}, o un puntatore, se usata con \var{sival\_ptr}.  L'unione
+viene usata dai segnali \textit{real-time}, ma anche da vari altri meccanismi
+di notifica, per inviare eventuali informazioni aggiuntive al gestore del
+segnale in \var{si\_value}. Ad esempio un campo di tipo \type{sigval\_t} è
+presente anche nella struttura \struct{sigevent} (definita in
+fig.~\ref{fig:struct_sigevent}) che viene usata da vari meccanismi di notifica
+come quelli per i timer POSIX (che vedremo in sez.~\ref{sec:sig_timer_adv}),
+quello dell'I/O asincrono (che vedremo in sez.~\ref{sec:file_asyncronous_io})
+o dalle code di messaggi POSIX (che vedremo in sez.~\ref{sec:ipc_posix_mq}).
+
+A causa di questa loro caratteristica, la funzione \func{kill}, pure essendo
+utilizzabile, non è adatta ad inviare segnali \textit{real-time}, perché non è
+in grado di impostare alcun valore per il campo \var{si\_value}. Per questo
+motivo lo standard POSIX ha previsto una nuova funzione, \funcd{sigqueue}, il
+cui prototipo è:
 
 \begin{funcproto}{
 \fhead{signal.h}
@@ -2817,7 +2980,6 @@ lo standard ha previsto una nuova funzione, \funcd{sigqueue}, il cui prototipo
 }
 \end{funcproto}
 
-
 La funzione invia il segnale indicato dall'argomento \param{signo} al processo
 indicato dall'argomento \param{pid}. Per il resto il comportamento della
 funzione è analogo a quello di \func{kill}, ed i privilegi occorrenti ad
@@ -2859,11 +3021,10 @@ prima di queste è \funcd{sigwait}, il cui prototipo è:
 \fdecl{int sigwait(const sigset\_t *set, int *sig)}
 \fdesc{Attende la ricezione di un segnale.} 
 }
-{La funzione ritorna $0$ in caso di successo e $-1$ per un errore, nel qual
-  caso \var{errno} assumerà uno dei valori
+{La funzione ritorna $0$ in caso di successo ed un valore positivo in caso di
+  errore con valore secondo la lista seguente
   \begin{errlist}
-  \item[\errcode{EINTR}] la funzione è stata interrotta.
-  \item[\errcode{EINVAL}] si è specificato un valore non valido per
+  \item[\errcode{EINVAL}] \param{set} contiene un numero di segnale non valido 
   \end{errlist}
   ed inoltre \errval{EFAULT} nel suo significato generico.}
 \end{funcproto}
@@ -2937,6 +3098,55 @@ che venga eseguita l'azione predefinita, devono essere mascherati per tutti i
 \textit{thread}, compreso quello dedicato alla gestione, che potrebbe
 riceverlo fra due chiamate successive.
 
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/rtsigvalsend.c}
+  \end{minipage} 
+  \normalsize 
+  \caption{Corpo principale di un programma di invio di segnali
+    \textit{real-time}.}
+  \label{fig:sig_rtsival_main}
+\end{figure}
+
+Come esempio elementare dell'uso dei segnali \textit{real-time}, e della
+possibilità di inviare informazioni al gestore degli stessi con
+\func{sigqueue}, si è riportato in fig.~\ref{fig:sig_rtsival_main} il corpo
+principale di un programma elementare che legge dal terminale un valore
+numerico, ed utilizza un segnale \textit{real-time} per inviarlo al gestore
+dello stesso. Nel codice sono stati trascurati i controlli dei valori di
+ritorno delle varie funzioni per mantenere la brevità dell'esempio.
+
+Dopo aver definito (\texttt{\small 5}) una variabile \var{value} di tipo
+\type{sigval\_t} per poter inviare i dati, e dopo aver opportunamente scelto
+(\texttt{\small 6}) per \var{signo} un segnale \textit{real-time}, la parte
+iniziale del programma (\texttt{\small 8--11}) installa il relativo gestore
+(la cui definizione è riportata in fig.~\ref{fig:sig_rtsival_handl}).  Dopo di
+che il programma si pone in un ciclo infinito (\texttt{\small 14--27}) in cui
+prima (\texttt{\small 15--20}) legge in buffer dallo \textit{standard input}
+una stringa immessa dall'utente, terminandola opportunamente (\texttt{\small
+  20}), e poi tenta di convertire la stessa (\texttt{\small 21}) in un numero
+con \func{strtol}, assegnando il risultato a \texttt{value.sival\_int}, se la
+conversione ha successo e \texttt{value.sival\_int} è positivo) invia a se
+stesso (\texttt{\small 23}) il segnale \textit{real-time}, altrimenti stampa
+un avviso (\texttt{\small 24}).
+
+Alla ricezione del segnale il gestore si limita a stampare alcune delle
+informazioni ricevute nella struttura \struct{sigval\_t}, ed in particolare
+(\texttt{\small 5}) stampa tramite il valore del campo \var{si\_value} il
+numero che gli è stato inviato da \func{sigqueue}.
+
+\begin{figure}[!htb]
+  \footnotesize \centering
+  \begin{minipage}[c]{\codesamplewidth}
+    \includecodesample{listati/rtsigvalsend_handl.c}
+  \end{minipage} 
+  \normalsize 
+  \caption{Codice del gestore usato dal programma di
+    fig.~\ref{fig:sig_rtsival_main}.} 
+  \label{fig:sig_rtsival_handl}
+\end{figure}
+
 
 \subsection{La gestione avanzata delle temporizzazioni}
 \label{sec:sig_timer_adv}
@@ -2986,20 +3196,6 @@ alta definizione però erano già presenti, essendo stata introdotte insieme ad
 altre funzioni per il supporto delle estensioni \textit{real-time} con il
 rilascio del kernel 2.6, ma la risoluzione effettiva era nominale.
 
-A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
-disporre di una versione \textit{real-time} almeno per l'orologio generale di
-sistema, quello che mantiene il \textit{calendar time} (vedi
-sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
-secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
-  Epoch}). Si ricordi infatti che l'orologio ordinario usato dal
-\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione
-effettiva normalmente non raggiunge il nanosecondo (a meno di hardware
-specializzato).  Oltre all'orologio generale di sistema possono essere
-presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene
-identificato da un opportuno valore di una variabile di tipo
-\type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
-tab.~\ref{tab:sig_timer_clockid_types}.
-
 \begin{table}[htb]
   \footnotesize
   \centering
@@ -3057,6 +3253,19 @@ tab.~\ref{tab:sig_timer_clockid_types}.
   \label{tab:sig_timer_clockid_types}
 \end{table}
 
+A tutte le implementazioni che si rifanno a queste estensioni è richiesto di
+disporre di una versione \textit{real-time} almeno per l'orologio generale di
+sistema, quello che mantiene il \textit{calendar time} (vedi
+sez.~\ref{sec:sys_time_base}), che in questa forma deve indicare il numero di
+secondi e nanosecondi passati a partire dal primo gennaio 1970 (\textit{The
+  Epoch}). Si ricordi infatti che l'orologio ordinario usato dal
+\textit{calendar time} riporta solo un numero di secondi, e che la risoluzione
+effettiva normalmente non raggiunge il nanosecondo (a meno di hardware
+specializzato).  Oltre all'orologio generale di sistema possono essere
+presenti altri tipi di orologi \textit{real-time}, ciascuno dei quali viene
+identificato da un opportuno valore di una variabile di tipo
+\type{clockid\_t}; un elenco di quelli disponibili su Linux è riportato in
+tab.~\ref{tab:sig_timer_clockid_types}.
 
 % TODO: dal 4.17 CLOCK_MONOTONIC e CLOCK_BOOTTIME sono identici vedi
 % https://lwn.net/Articles/751651/ e
@@ -3126,17 +3335,17 @@ stata inizializzata con il valore che si vuole impostare sull'orologio, mentre
 per \func{clock\_gettime} verrà restituito al suo interno il valore corrente
 dello stesso.
 
-Si tenga presente inoltre che per eseguire un cambiamento sull'orologio
-generale di sistema \const{CLOCK\_REALTIME} occorrono i privilegi
-amministrativi;\footnote{ed in particolare la \textit{capability}
-  \const{CAP\_SYS\_TIME}.} inoltre ogni cambiamento ad esso apportato non avrà
-nessun effetto sulle temporizzazioni effettuate in forma relativa, come quelle
-impostate sulle quantità di \textit{process time} o per un intervallo di tempo
-da trascorrere, ma solo su quelle che hanno richiesto una temporizzazione ad
-un istante preciso (in termini di \textit{calendar time}). Si tenga inoltre
-presente che nel caso di Linux \const{CLOCK\_REALTIME} è l'unico orologio per
-cui si può effettuare una modifica, infatti nonostante lo standard preveda la
-possibilità di modifiche anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
+Per eseguire un cambiamento sull'orologio generale di sistema
+\const{CLOCK\_REALTIME} occorrono i privilegi amministrativi;\footnote{ed in
+  particolare la \textit{capability} \const{CAP\_SYS\_TIME}.} e che ogni
+cambiamento ad esso apportato non avrà nessun effetto sulle temporizzazioni
+effettuate in forma relativa, come quelle impostate sulle quantità di
+\textit{process time} o per un intervallo di tempo da trascorrere, ma solo su
+quelle che hanno richiesto una temporizzazione ad un istante preciso (in
+termini di \textit{calendar time}). Si tenga inoltre presente che nel caso di
+Linux \const{CLOCK\_REALTIME} è l'unico orologio per cui si può effettuare una
+modifica, infatti nonostante lo standard preveda la possibilità di modifiche
+anche per \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
 \const{CLOCK\_THREAD\_CPUTIME\_ID}, il kernel non le consente.
 
 Oltre alle due funzioni precedenti, lo standard POSIX prevede una terza
@@ -3172,16 +3381,15 @@ voglia utilizzare nelle funzioni di impostazione che non corrisponda ad un
 multiplo intero di questa risoluzione, sarà troncato in maniera automatica. 
 
 Gli orologi elencati nella seconda sezione di
-tab.~\ref{tab:sig_timer_clockid_types} sono delle estensioni specifiche di
-Linux, create per rispondere ad alcune esigenze specifiche, come quella di
-tener conto di eventuali periodi di sospensione del sistema, e presenti solo
-nelle versioni più recenti del kernel. In particolare gli ultimi due,
-contraddistinti dal suffisso \texttt{\_ALARM}, hanno un impiego particolare,
-derivato dalle esigenze emerse con Android per l'uso di Linux sui cellulari,
-che consente di creare timer che possono scattare, riattivando il sistema,
-anche quando questo è in sospensione. Per il loro utilizzo è prevista la
-necessità di una capacità specifica, \const{CAP\_WAKE\_ALARM} (vedi
-sez.~\ref{sec:proc_capabilities}).
+tab.~\ref{tab:sig_timer_clockid_types} sono estensioni specifiche di Linux
+presenti solo nelle versioni più recenti del kernel, create per rispondere ad
+alcune esigenze specifiche come quella di tener conto di eventuali periodi di
+sospensione del sistema. In particolare gli ultimi due, contraddistinti dal
+suffisso \texttt{\_ALARM}, hanno un impiego particolare derivato dalle
+esigenze emerse con Android per l'uso di Linux sui cellulari, che consente di
+creare timer che possono scattare, riattivando il sistema, anche quando questo
+è in sospensione. Per il loro utilizzo è prevista la necessità di una capacità
+specifica, \const{CAP\_WAKE\_ALARM} (vedi sez.~\ref{sec:proc_capabilities}).
 
 Si tenga presente inoltre che con l'introduzione degli \textit{high resolution
   timer} i due orologi \const{CLOCK\_PROCESS\_CPUTIME\_ID} e
@@ -3683,10 +3891,10 @@ anch'essa introdotta dallo standard POSIX.1, il suo prototipo è:
 La funzione permette di ricavare quali sono i segnali pendenti per il processo
 in corso, cioè i segnali che sono stati inviati dal kernel ma non sono stati
 ancora ricevuti dal processo in quanto bloccati. Non esiste una funzione
-equivalente nella vecchia interfaccia, ma essa è tutto sommato poco utile,
-dato che essa può solo assicurare che un segnale è stato inviato, dato che
-escluderne l'avvenuto invio al momento della chiamata non significa nulla
-rispetto a quanto potrebbe essere in un qualunque momento successivo.
+equivalente nella vecchia interfaccia, ma essa, potendo solo assicurare che un
+segnale è stato inviato, è tutto sommato poco utile dato che escluderne
+l'avvenuto invio al momento della chiamata non significa nulla rispetto a
+quanto potrebbe accadere in un qualunque momento successivo.
 
 Una delle caratteristiche di BSD, disponibile anche in Linux, è la possibilità
 di usare uno \textit{stack} alternativo per i segnali; è cioè possibile fare
@@ -3846,21 +4054,21 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
 \label{sec:sig_pid_fd}
 
 
-% TODO: trattare (qui?) pidfd_send_signal() introdotta con il kernel 5.1 vedi
+% 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/ 
-% oppure sopra in "Ulteriori funzioni di gestione"
+% 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
-% man pidfd_send_signal su le versioni più recenti della man pages
-
-
+% 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
@@ -3909,7 +4117,7 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
 % 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:  KILLED DUMPED TRAPPED STOPPED CONTINUED PRI HUP SigHandler
 % 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
@@ -3920,10 +4128,13 @@ tipo \type{sigjmp\_buf}, è assolutamente identica a \func{longjmp}.
 % 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
+% LocalWords:  sigorset sigandset BOOTTIME Android request remain cap jiffies
 
 
 %%% Local Variables: 
 %%% mode: latex
 %%% TeX-master: "gapil"
 %%% End: 
+%  LocalWords:  IPC dest left right trampoline BNDERR MPX PKUERR MCEERR async
+%  LocalWords:  BRANCH branch HWBKPT watchpoint SECCOMP seccomp wrapper pidfd
+%  LocalWords:  fchdir sigmask safety
index a9e4cd530383947868624e9cf6fcbe7967089df9..8eede0482c7b3bdc38071c09d910cd2ba2dcdf9b 100644 (file)
@@ -1,6 +1,6 @@
 %% sockadv.tex
 %%
-%% Copyright (C) 2004-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 9d5279e6ab62856b34ff617697608b440c23c03e..19f9ddccdea8e20eb743badfb0f1b57f16ed6173 100644 (file)
@@ -1,6 +1,6 @@
 %% sockctrl.tex
 %%
-%% Copyright (C) 2004-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2004-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Prefazione",
@@ -2669,8 +2669,10 @@ tab.~\ref{tab:sock_opt_socklevel} sul significato delle varie opzioni:
 \item[\constd{SO\_TYPE}] questa opzione permette di leggere il tipo di socket
   su cui si opera; funziona solo con \func{getsockopt}, ed utilizza per
   \param{optval} un intero in cui verrà restituito il valore numerico che lo
-  identifica (ad esempio \const{SOCK\_STREAM}). 
-
+  identifica (ad esempio \const{SOCK\_STREAM}).
+  
+% TODO verificare IP_LOCAL_PORT_RANGE, aggiunta con il 6.3
+% vedi https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=91d0b78c5177
 
 \end{basedescript}
 
index b01ff3aa67a6f224db9e52899f7397e46daa406e..51bdad7768d03ebe1d2d7a7f712cbd8ed784db3f 100644 (file)
@@ -1,6 +1,6 @@
 %% socket.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 429fc6f3552f5097f998f1d72fd4299d11a03a4a..b46672d07e0874984a952d722cf842035a8bc236 100644 (file)
@@ -89,13 +89,19 @@ int UnlockFile(const char* path_name);
 /*
  * Signal Handling Functions
  */
-typedef void SigFunc(int);
+typedef void SigHandler(int);
+typedef void SigAction(int, siginfo_t *, void *);
 /* Function Signal: Initialize a signal handler. See SigHand.c */
-SigFunc * Signal(int signo, SigFunc *func);
+SigHandler * Signal(int signo, SigHandler *func);
 /* Function SignalRestart: restart system calls. See SigHand.c */
-SigFunc * SignalRestart(int signo, SigFunc *func);
+SigHandler * SignalRestart(int signo, SigHandler *func);
 /* Function HandSigCHLD: to handle SIGCHILD. See SigHand.c */
 void HandSigCHLD(int sig);
+/* Function Action: Initialize a sa_sigaction handler. See SigHand.c */
+SigAction * Action(int signo, SigAction *func);
+/* Function Action: Initialize a sa_sigaction handler. See SigHand.c */
+SigAction * ActionRestart(int signo, SigAction *func);
+
 /* 
  * Socket/Files service functions
  */
index a37fac5ab28daa68412e392ce4e07f431a5b7fcf..605493d1f2f6779c7200f589e125658c2f98cc64 100644 (file)
  * Initialize a signal handler.
  * To enable the signal handling a process we need to tell it to
  * kernel; this is done writing all needed info to a sigaction structure
- * named sigact, and then callind sigaction() system call passing the
+ * named sigact, and then calling sigaction() system call passing the
  * information stored in the sigact structure variable.
  *
  * Input:  the signal to handle 
  *         the signal handler function
- * Return: the previous sigaction structure
+ * Return: the previous signal handler
  */
-inline SigFunc * Signal(int signo, SigFunc *func) 
+inline SigHandler * Signal(int signo, SigHandler *func) 
 {
     struct sigaction new_handl, old_handl;
+    new_handl.sa_flags=0;                    /* init to 0 all flags */
     new_handl.sa_handler = func;             /* set signal handler */
     /* clear signal mask: no signal blocked during execution of func */
     if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
         return SIG_ERR;
     }
-    new_handl.sa_flags=0;                    /* init to 0 all flags */
     /* change action for signo signal */
     if (sigaction(signo, &new_handl, &old_handl)){ 
         return SIG_ERR;
@@ -65,19 +65,19 @@ inline SigFunc * Signal(int signo, SigFunc *func)
  * Initialize a signal handler.
  * To enable the signal handling a process we need to tell it to
  * kernel; this is done writing all needed info to a sigaction structure
- * named sigact, and then callind sigaction() system call passing the
+ * named sigact, and then calling sigaction() system call passing the
  * information stored in the sigact structure variable.
  * This version enable BSD semantics with SA_RESTART
  *
  * Input:  the signal to handle 
  *         the signal handler function
- * Return: the previous sigaction structure
+ * Return: the previous signal handler
  */
-inline SigFunc * SignalRestart(int signo, SigFunc *func) 
+inline SigHandler * SignalRestart(int signo, SigHandler *func) 
 {
     struct sigaction new_handl, old_handl;
-    new_handl.sa_handler = func;             /* set signal handler */
     new_handl.sa_flags = SA_RESTART;         /* restart system call */
+    new_handl.sa_handler = func;             /* set signal handler */
     /* clear signal mask: no signal blocked during execution of func */
     if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
         return SIG_ERR;
@@ -89,10 +89,64 @@ inline SigFunc * SignalRestart(int signo, SigFunc *func)
     return (old_handl.sa_handler);
 }
 
+/*
+ * Function Action
+ * Initialize a sa_sigaction signal handler.
+ * To enable the signal handling a process we need to tell it to
+ * kernel; this is done writing all needed info to a sigaction structure
+ * named sigact, and then calling sigaction() system call passing the
+ * information stored in the sigact structure variable.
+ *
+ * Input:  the signal to handle 
+ *         the signal handler function (sa_sigaction type)
+ * Return: the previous signal handler
+ */
+inline SigAction * Action(int signo, SigAction *func) 
+{
+    struct sigaction new_handl, old_handl;
+    new_handl.sa_flags=SA_SIGINFO;           /* we use sa_sigaction handler */
+    new_handl.sa_sigaction = func;           /* set signal handler */
+    /* clear signal mask: no signal blocked during execution of func */
+    if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
+        return NULL;
+    }
+    /* change action for signo signal */
+    if (sigaction(signo, &new_handl, &old_handl)){ 
+        return NULL;
+    }
+    return (old_handl.sa_sigaction);
+}
+/*
+ * Function Action
+ * Initialize a sa_sigaction signal handler.
+ * To enable the signal handling a process we need to tell it to
+ * kernel; this is done writing all needed info to a sigaction structure
+ * named sigact, and then calling sigaction() system call passing the
+ * information stored in the sigact structure variable.
+ *
+ * Input:  the signal to handle 
+ *         the signal handler function (sa_sigaction type)
+ * Return: the previous signal handler
+ */
+inline SigAction * ActionRestart(int signo, SigAction *func) 
+{
+    struct sigaction new_handl, old_handl;
+    new_handl.sa_flags=SA_SIGINFO|SA_RESTART;/* flag setup */
+    new_handl.sa_sigaction = func;           /* set signal handler */
+    /* clear signal mask: no signal blocked during execution of func */
+    if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
+        return NULL;
+    }
+    /* change action for signo signal */
+    if (sigaction(signo, &new_handl, &old_handl)){ 
+        return NULL;
+    }
+    return (old_handl.sa_sigaction);
+}
 
 /* 
  * Functions: HandSigCHLD
- * Generic handler for SIGCHLD signal
+ * Generic simple handler for SIGCHLD signal
  * 
  * Simone Piccardi Dec. 2002
  */
diff --git a/sources/rtsigvalsend.c b/sources/rtsigvalsend.c
new file mode 100644 (file)
index 0000000..c989488
--- /dev/null
@@ -0,0 +1,76 @@
+/* rtsigvalsend.c
+ * 
+ * Copyright (C) 2021 Simone Piccardi
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/****************************************************************
+ *
+ * Program rtsigvalsend.c: 
+ * Program to test sigqueue and sigval send
+ *
+ * Author: Simone Piccardi
+ * Aug 2021
+ *
+ * Usage: ./rtsigvalsend
+ **********************************************************/
+/* 
+ * Include needed headers
+ */
+#include <unistd.h>      /* unix standard library */
+#include <stdio.h>       /* standard I/O library */
+#include <stdlib.h>      /* C standard library */
+#include <string.h>      /* C strings library */
+#include <signal.h>      /* signal constants, types and functions */
+#include <errno.h>       /* error definitions and routines */
+#include <time.h>
+
+#define MAXLINE 256
+
+void sig_handler(int signum, siginfo_t *info, void *ucontext) {
+    printf("Signal %d\n", signum);
+    printf("From pid %d\n", info->si_pid);
+    printf("From user %d\n", info->si_uid);
+    printf("Value %d\n", info->si_value.sival_int);
+}
+
+int main(int argc, char *argv[], char *envp[])
+{
+    char buffer[MAXLINE+1];
+    int nread;
+    sigval_t value;
+    int signo = SIGRTMIN+1;
+
+    struct sigaction new_handl, old_handl;
+    sigemptyset(&new_handl.sa_mask);
+    new_handl.sa_sigaction = sig_handler;
+    new_handl.sa_flags=SA_SIGINFO;
+    /* change action for signo signal */
+    sigaction(signo, &new_handl, &old_handl);
+    while (1) {
+       nread = read(STDIN_FILENO, buffer, MAXLINE);
+       if (nread < 0) {
+           printf("Errore in lettura: %s\n", strerror(errno));
+            return 0;
+       }
+       buffer[nread]=0;
+       value.sival_int = strtol(buffer, NULL, 10);
+       if (value.sival_int > 0) {
+           sigqueue(getpid(), signo, value);
+       } else {
+           printf("Ignoring invalid input\n");
+       }
+    }
+}
diff --git a/sources/sigwait.c b/sources/sigwait.c
new file mode 100644 (file)
index 0000000..7dcc983
--- /dev/null
@@ -0,0 +1,66 @@
+/* sigwait.c
+ * 
+ * Copyright (C) 2021 Simone Piccardi
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+/****************************************************************
+ *
+ * Program sigwait.c: 
+ * Test program for sigwait function
+ *
+ * Author: Simone Piccardi
+ * Nov. 2021
+ *
+ ****************************************************************/
+/* 
+ * Include needed headers
+ */
+#define _GNU_SOURCE
+#include <unistd.h>      /* unix standard library */
+#include <signal.h>      /* signal constants, types and functions */
+#include <errno.h>       /* error definitions and routines */ 
+#include <stdlib.h>      /* C standard library */
+#include <unistd.h>      /* unix standard library */
+#include <stdio.h>      /* standard I/O library */
+#include <string.h>      /* C strings library */
+
+int main(int argc, char *argv[])
+{
+/* 
+ * Variables definition  
+ */
+    int i;
+    pid_t pid = 0;
+    int sig,res;
+    sigset_t set;
+
+    sigemptyset(&set);
+    sigaddset(&set, SIGALRM);
+//    while (1) {
+    res=sigwait(&set, &sig);
+    printf("Sig was %d", sig);
+    if ( res > 0) {
+       printf("Errno was %d", errno);
+       perror("errore");
+       printf("Result was %d", res);
+       printf("Error by res was %s", strerror(res));
+       exit(11);
+    } else {
+       printf("Result was %d", res);
+       printf("Normal exit");
+    }
+//    }
+}
index b021b2fbc1f992a22d3a2fe765c7b0eae839b9a4..010cef54d87e0a4bcd1325afbde4a1a2959c2a1c 100644 (file)
@@ -40,9 +40,9 @@
 #include <time.h>
 
 void sig_hand(int, siginfo_t *, void *);
-typedef void SigFunc(int, siginfo_t *, void *);
+typedef void SigAction(int, siginfo_t *, void *);
 /* Function Signal: Initialize a signal handler. See SigHand.c */
-SigFunc * Signal(int signo, SigFunc *func);
+SigAction * Signal(int signo, SigAction *func);
 
 FILE * file;
 
@@ -95,7 +95,7 @@ void sig_hand(int sig, siginfo_t * siginfo, void *ptr) {
     fprintf(file, "Printed time: %s", ctime(&t));
 }
 
-inline SigFunc * Signal(int signo, SigFunc *func) 
+inline SigAction * Signal(int signo, SigAction *func) 
 {
     struct sigaction new_handl, old_handl;
     new_handl.sa_sigaction = func;             /* set signal handler */
index a761b4dcd31e2431c3ea9f19294975863f1ee21f..671b1029c733bbae7c8acf9e5e00113c89bd33be 100644 (file)
@@ -1,6 +1,6 @@
 %% system.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 5951a91107a872bde436424df1adaa7ce8cfe96a..525867ecdcc3d038f741b97bec23e445bdc8c3d2 100644 (file)
@@ -1,6 +1,6 @@
 %% tcpsock.tex
 %%
-%% Copyright (C) 2000-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2000-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 62f4dfdf7e9bc388c02835965d9a36b120d6c0d5..b0679203e9cab2ab7a32e6b3926cd35af44e65cb 100644 (file)
@@ -1,6 +1,6 @@
 %% thread.tex
 %%
-%% Copyright (C) 2007-2019 Simone Piccardi.  Permission is granted to
+%% Copyright (C) 2007-2024 Simone Piccardi.  Permission is granted to
 %% copy, distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",
index 97b0efb7eaf28755b8d2ed3d428fbaed5100b823..4493730c46a25b5e4d88264374973452dfdba801 100644 (file)
@@ -1,6 +1,6 @@
 %% tcpprot.tex
 %%
-%% Copyright (C) 2002-2019 Simone Piccardi.  Permission is granted to copy,
+%% Copyright (C) 2002-2024 Simone Piccardi.  Permission is granted to copy,
 %% distribute and/or modify this document under the terms of the GNU Free
 %% Documentation License, Version 1.1 or any later version published by the
 %% Free Software Foundation; with the Invariant Sections being "Un preambolo",