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

    [C - Linux] Bloccare una seconda istanza dello stesso codice

    Salve,

    io avrei un piccolo problema, anzi direi più un dubbio.
    Sto sviluppando un pogramma in ambiente C su linux che implemente un server e due client (istanze dello stesso codice) che comunicano tra di loro attraverso degli scambi di messaggi.
    Il problema che nasce è nel momento in cui un secondo server va a connettersi, di fatto il server crea la struttura dati che permette ai due client di interagire.. e se questa venisse distrutta e ricreata da un nuovo server, si avrebbe una consecutiva perdita di sincronizzazione e di informazioni.
    A questo punto mi è venuta l'idea di creare un processo figlio del server che controllasse lo stato di terminazione del processo padre, ma questo si mostra sconveniente e ho optato per questa soluzione:

    Effettuare all'avvio del server, un controllo nella lista dei processi attivi e verificare se un iatanza della stessa applicazione fosse gia attiva, qualora il test è positivo allora termina iil secondo server, altrimenti lo avvia.

    Qualcuno ha idea e suggerimenti di come implementarlo in codice C? Un programma che si autotermina se un istanza dello stesso codice gia esiste?

    Grazie.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma questa applicazione server, che fa?

    Per esempio, lavora in rete e si mette in ascolto su una porta?

  3. #3
    lavora in locale, usa sca,bi di messaggi sfrottando la RAM in cui vi è una coda detta Mailbox

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma la coda e' creata dallo stesso programma server e quindi non e' visibile da un altro processo.

    Una nuova istanza del tuo programma dovrebbe creare un'altra coda e non potere influenzare l'altra ..

  5. #5
    Il problema è questo

    Per creare quella coda io uso delle Sysem call impotyate da sys/msg.h

    allora quando invoco la system call

    int risposta = msg(chiave,IPC_CREAT|0666);

    ottengo -1 se la coda esiste.

    Adesso siccome ogni volta il server fa il controllo e se esiste la coda (per causa di un errore di esecuizione, infatti il server potrebbe essere terminato senza chiuderla) Lui distrugge la coda indicata con "chiave" e ne crea una nuova al suo posto.

    allora senza fare troppi controlli e dato che vogliamo un solo server funzionante senza che usi un'altro canale (anche perché i client per leggere dovranno usare la medesima chiave), sto cercando la soluzione che mi termini l'istanza corrente del codice del server se ne esiste gia una in esecuzione.

  6. #6
    Io avevo avuto un problema simile, ma sotto windows: avevo un'applicazione le cui varie istanze dovevano comunicare tra loro mediante named-pipe, più precisamente ci doveva essere un solo server e molti client che si connettevano tutti a lui e lui doveva gestire ogni client co un thread separato. Ora all'avvio di ogni istanza l'utente poteva decidere se l'istanza doveva essere un client o un server, se l'utente sceglieva client ok, l'istanza rimaneva in ogni caso, se sceglieva server dovevo controllare che non ci fosse già un server attivo e nel caso terminare l'istanza corrente. Il problema era come fare a capire se il server c'era già? Semplice controllavo se la pipe era già occupata in scrittura o no. Tu anche se non hai bisogno di sfruttare le pipe per altro potresti sempre usarle per capire se già un'istanza della tua app è attiva. Oppure potresti agire su un file o su una variabile d'ambiente, insomma su qualsiasi cosa che ti consenta di impostare un flag sul sistema in grado di sopravvivere tra un'esecuzione e l'altra della tua app
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  7. #7
    Io in origine avevo pensato a un token che rimanesse sulla coda dei messaggi, e che ogni nuovo Server se avesse trovato quel Token allora avrebbe smesso la sua esecuzione, ma resta comunque il puntoi della gestione degli errori che è un po diversa.

    Se il mio Server crashia e termina, la coda resta in memoria e il canale aperto, quindi anche il Token che non permetterà più a nessun server di connettersi su quel canale.

    Il problema quindi resta sempre lo stesso.

    Una soluzione sarebbe quella di usare un canale di inizializzazione ma alla fine si creerebbe un ambiente multi server multi client e non è una cosa che vorrei fare.

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.