Mar 14 Agosto, 17:47:27 - 2018

Autore Topic: Chiarimento Signal  (Letto 99 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Charlie

  • Studente
  • *
  • Post: 6
  • FeedBack: +1/-0
    • Mostra profilo
Chiarimento Signal
« il: Sab 14 Luglio, 12:09:57 - 2018 »
Ciao A tutti,
stavo cercando di approfondire meglio gli interrupt con un semplice programmino ma non capisco una cosa:

Codice: [Seleziona]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

int valore=0;

void scambia(){
    printf("Uscita dal programma\n");
    valore=1;
    }

int main()
{   
    signal(SIGINT, scambia);
    while (valore==0)
    {
        printf("hello world\n");
        sleep(1);
    }
    return 0;
}
In questo modo il programma viene eseguito correttamente.

Se provo a mettere la variabile nella funzione facendo scambia(valore), ricevo un errore sulla funzione signal().
Codice: [Seleziona]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void scambia(int valore){
    printf("Uscita dal programma\n");
    valore=1;
    }

int main()
{   
    int valore=0;
    signal(SIGINT, scambia(valore));
    while (valore==0)
    {
        printf("hello world\n");
        sleep(1);
    }
    return 0;
}

Mettendo invece
Codice: [Seleziona]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void scambia(int valore){
    printf("Uscita dal programma\n");
    valore=1;
    }

int main()
{   
    int valore=0;
    signal(SIGINT, scambia);
    while (valore==0)
    {
        printf("hello world\n");
        sleep(1);
    }
    return 0;
}

il programma viene correttamente compilato, la funzione viene eseguita tranne per la parte in cui il valore viene sostituito!

Come posso quindi eseguire una funzione quando viene raccolto un interrupt passando dei parametri alla funzione da eseguire (senza variabili globali....)?
« Ultima modifica: Sab 14 Luglio, 12:22:54 - 2018 da Charlie »

Offline MarvinPuppets

  • Neo-Laureato
  • **
  • Post: 60
  • FeedBack: +1/-0
    • Mostra profilo
Re:Chiarimento Signal
« Risposta #1 il: Gio 19 Luglio, 10:23:08 - 2018 »
Mi gioco 50 euro che ti hanno insegnato Java o Python come primo linguaggio :)

Citazione
Come posso quindi eseguire una funzione quando viene raccolto un interrupt passando dei parametri alla funzione da eseguire (senza variabili globali....)?

Ti spiego cosa sta avvenendo nei 3 esempi :

1) La variabile valore è globale, il motivo per cui funziona, è che le variabili globabali vengono allocate all'avvio del processo e deallocate quando il processo viene rimosso. (semplicemente se non capisci cosa significa prendi un manuale di C e vedi le variabili globali)

2) Nel secondo vuoi passare alla funzione scambia un valore. La cosa è errata signal vuole come argomento un puntatore a funzione. Esatto, quando nella signal passi la funzione scambia **senza parentesi e argomenti** stai letteralmente dando alla signal un puntatore all'area di memoria che contiene la tua funzione. Perché? Perché in C questo è l'unico modo di chiamare una funzione in modo dinamico.

Quando invece passi alla signal, la funzione **con gli argomenti e le parentesi*** esempio 2 per capirci, non stai passando un puntatore a funzione ma stai eseguendo la funzione, e gli stai passando il valore di ritorno della funzione scambia().

3) Non funziona perché quando passi valore nella funzione scambia, il valore viene temporaneamente copiato (vedi allocazione nello stack, e allocazione nell'heap). Significa che succede questo:

* Dichiari valore = 0, la var. viene allocata nello stack nello scope della funzione main.
* Passi a signal il puntatore alla funzione scambia.
* A un certo punto nel futuro, il segnale viene gestito :

a) signal esegue il codice contenuto all'indirizzo del puntatore a funzione.
b) a questo punto tu sei convinto che l'argomento sia il valore, in realtà la signal passa al tuo handler un altro valore. Il valore che gli viene passato è l'ID del segnale corrente. Questo perché potresti usare una sola funzione per gestire più segnali, e in questo modo puoi riconoscere in quale caso ti trovi.

Tu stai tentando di modificare la variabile valore dichiarata nel main, ma non è possibile sia per il motivo qua sopra ma anche perché per modificare una variabile in quel modo dovresti passarla come puntatore.

* A questo punto valore è sempre = 0, il valore che hai ricevuto in scambia NON era quello che pensavi tu, e per questo non funziona.

Per concludere, con i segnali devi per forza usare una variabile globale come l'esempio 1. Ma ti consiglio di capire bene le cose che ti ho scritto qua sopra.
« Ultima modifica: Gio 19 Luglio, 10:51:11 - 2018 da MarvinPuppets »

Offline Charlie

  • Studente
  • *
  • Post: 6
  • FeedBack: +1/-0
    • Mostra profilo
Re:Chiarimento Signal
« Risposta #2 il: Sab 21 Luglio, 17:53:24 - 2018 »
Il punto 2 è abbastanza chiarificatore, ti ringrazio.
Per toglierti la curiosità, comunque è Python all'università anche se alle superiori è stato Pascal (e poi Java  :asd:)