Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Richiesta aiuto per programmi real-time

    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

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,482

    Moderazione

    Nelle tue discussioni manca sempre una domanda specifica o un problema particolare verso il quale indirizzarsi.

    Non è lecito chiedere agli utenti di compilare l'intero programma che hai scritto per scovare cosa c'è che non va e fornirti l'analisi dei problemi e relative soluzioni.

    Quando apri una discussione, specifica un titolo significativo che dia informazioni sul problema, descrivi cosa ottieni e cosa invece vorresti ottenere, oppure il messaggio di errore che ti viene restituito, e fai attenzione alla formattazione corretta del codice.

    Senza questi elementi fondamentali, non è possibile condurre la discussione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.