Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214

    [C] Variabile globale a più file

    Ciao a tutti, ho un problema con la gestione di una variabile globale a più files. Ho dichiarato in un header la mia variabile di tipo int, in tutti i files che utilizzano questa variabile ho poi incluso il suddetto header. Il punto è che se uno qualunque dei files aggiorna la variabile, il valore non cambia negli altri. Vi faccio un esempio:
    cond.h
    codice:
     
    extern int val;
    cond.c
    codice:
    #include "cond.h"
    int val = 0;
    file1.c
    codice:
    #include "cond.h"
    extern int val;
    
    void foo(){
      val = 1; 
    }
    file2.c
    codice:
    #include "cond.h"
    extern int val; 
    void foo(){
     printf("%d", val); 
    }
    Eseguendo il programma con un makefile, avviando i due eseguibili, ottengo la stampa del valore 0, ovvero il valore non aggiornato della variabile.

    L'esempio che ho scritto sopra è solo una generalizzazione del mio problema, che in realtà è quello del produttore consumatore. La variabile mi serve per sospendere o riattivare uno dei due processi.

    Cosa sbaglio?

  2. #2
    Diciamo che quello che vuoi fare non si fa cosi.
    La variabile val è globale solo nello scope del singolo processo.
    Con questo meccanismo puoi solo condividere val tra moduli dello stesso processo.
    Per la comunicazione tra processi devi utilizzare qualcosa'altro.
    Prova a prendere un'altra strada e riproponila qui.
    Ciao.
    http://clessonsonline.blogspot.com

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ci stavo pensando anche io, ho confuso thread e processi. Devo condividere un segmento di memoria in modo che i processi possano andare a prendere le varie variabili condivise da li. Oppure dovrei farli comunicare con un pipe o una socket, andando a scrivere il valore della variabile modificata...Ci penso un po e posto una bozza! Grazie mille!

  4. #4
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Originariamente inviato da infoartenovo
    Diciamo che quello che vuoi fare non si fa cosi.
    La variabile val è globale solo nello scope del singolo processo.
    Con questo meccanismo puoi solo condividere val tra moduli dello stesso processo.
    Per la comunicazione tra processi devi utilizzare qualcosa'altro.
    Prova a prendere un'altra strada e riproponila qui.
    Ciao.
    Ma l' utente ha detto di usare più processi? Era sottinteso che creava più processi con la fork?

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    214
    Ma l' utente ha detto di usare più processi? Era sottinteso che creava più processi con la fork?
    Grazie per la risposta Who I am, è vero, non ho esplicitato direttamente che i processi comunicanti sono due o più. In ogni caso si, sono molteplici processi non creati mediante fork, ma avviati indipendentemente l'uno dall'altro, che comunicano tutti con un processo. In pratica è l'implementazione di un sistema client-server, dove il server riceve le richieste di ogni singolo client creando un thread per evaderle, mentre i clienti sono processi indipendenti che interrogano il server.

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Usa la funzione pipe prima di fare la fork.Poi decidi qual'è il processo che scrive e il processo che legge.Il processo che legge usa il lato zero della pipe, quello che scrive usa il lato 1, chiudi i file descriptor che non sono utilizzati:

    codice:
    int fd[2];
    pipe(fd);
    pid_t pid=fork();
    if(pid)
    {
        // supponiamo che il padre scrive
        close(fd[0]);
        // procedi utilizzando fd[1] per scrivere
    }
    else
    {
        close(fd[1]);
        // procedi utilizzando fd[0] per leggere

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 © 2025 vBulletin Solutions, Inc. All rights reserved.