Aggiunto esempio di gestione di segnali con la semantica BSD per il restart
[gapil.git] / listati / SignalRestart.c
diff --git a/listati/SignalRestart.c b/listati/SignalRestart.c
new file mode 100644 (file)
index 0000000..89bc502
--- /dev/null
@@ -0,0 +1,15 @@
+inline SigFunc * SignalRestart(int signo, SigFunc *func) 
+{
+    struct sigaction new_handl, old_handl;
+    new_handl.sa_handler = func;             /* set signal handler */
+    new_handl.sa_flags = SA_RESTART;         /* restart system call */
+    /* clear signal mask: no signal blocked during execution of func */
+    if (sigemptyset(&new_handl.sa_mask)!=0){ /* initialize signal set */
+        return SIG_ERR;
+    }
+    /* change action for signo signal */
+    if (sigaction(signo, &new_handl, &old_handl)){ 
+        return SIG_ERR;
+    }
+    return (old_handl.sa_handler);
+}