Ciao a tutti, ho da poco iniziato un corso di programmazione realtime in uni, e vorrei postare qua i vari programmi che faccio fatica a comprendere; vorrei iniziare da quello che nel corso viene chiamato oscillator.c; premetto che ho più o meno capito i pezzi singoli, però non riesco a capaciatrmi del perchè ha un certo output, quindi probabilmente in qualche punto fa delle chiamate ad altre cose implicitamente, trattandosi di segnali del kernel tra l'altro:

[CODE]
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>

static int seconds;

#ifdef HANDLER1
static void handler1(int signo)
{
printf("My child is dead...\n");

exit(0);
}
#endif

static void handler(int signo)
{
seconds++;
}

int main(int argc, char *argv[])
{
pid_t child, parent;
struct sigaction new, old;
int res;

new.sa_handler = handler; //Adesso ogni volta che ricevi un SIGCHLD il controllo passera' alla rotuine 'handler(...)'
sigemptyset(&new.sa_mask); // imposta il set di segnali 'sa_mask' come vuoto
new.sa_flags = 0;

res = sigaction(SIGUSR1, &new, &old);//permette di specificare le modalità con cui un segnale può essere gestito da un processo; installa una nuova
//azione per SIGUSR1
if (res < 0) {
perror("SigAction");

return -1;
}

#if defined(HANDLER1) || defined(NOZOMBIE)
#ifdef HANDLER1
new.sa_handler = handler1;
#else
new.sa_handler = SIG_IGN; //il segnale deve essere ignorato
#endif

res = sigaction(SIGCLD, &new, &old);//SIGCLD: tale segnale viene inviato al proprio padre da ogni processo quando termina, in modo
//che il processo padre possa effettuare chiamare la syscall wait() per togliere il figlio dallo stato di zombie
if (res < 0) {
perror("SigAction");

return -1;
}
#endif

child = fork();
if (child < 0) {
perror("Fork");

return -1;
}

if (child == 0) {
/* We are in the child process... Note that it inherited the signal table!
*/
int i;

parent = getppid();
for(i = 0; i < 5; i++) {
sleep(1); //sospende il processo corrente per 1 secondi o fino all'arrivo di un segnale che non sia ignorato.
kill(parent, SIGUSR1); // SIGUSR1 è definito dall'utente cosa deve fare; viene mandato a 'parent' dal processo corrente
pause(); /* Wait for a signal! */
printf("Child woke up after %d seconds -- time = %d\n",
2 * seconds, (int)time(NULL)); /* Why "2 * " ??? */
}

return 0;
}

printf("In the father!\n");
if (seconds == 0) pause();
for(;{
printf("Father woke up after %d seconds -- time = %d\n",
2 * seconds - 1, (int)time(NULL));
sleep(1);
kill(child, SIGUSR1);
pause();
}

return 0;
}
[CODE]

Grazie