Consenti thread (in c) per stampare messaggi senza interferire con l'input dell'utente

5

Sto scrivendo un piccolo server web per uso personale in c (non c ++). Voglio consentire l'input dell'utente nella console come "shutdown server" o "restart server".

Per consentire questo tipo di input il server è in esecuzione in un thread separato (pthreads), quindi la console non è bloccata.

Voglio anche che questo thread stampi l'output nella console come "un nuovo client connesso" o "client requestet" home.html "".

The problem is: If I'm typing something like "shutdown server" and at the same time the thread prints something like "a new client connected" everthing mixes up and I get something like "shuta new client connectedown server"

Esiste un modo elegante per stampare l'output del thread e allo stesso tempo consentire all'utente di immettere comandi senza interferire entrambi?

O questa è una stupida idea per cominciare? Se sì: esiste un modo standard per gestire cose del genere (cioè per controllare il server).

    
posta mjb 04.03.2013 - 18:33
fonte

2 risposte

1

Quando avvii il tuo server da una riga di comando, quella console dovrebbe essere usata come log in esecuzione (dovresti anche avere i log scritti su un file per un po 'di permanenza. Ci sono due opzioni per gestire lo scenario.

  1. Fai in modo che il tuo server interrompa temporaneamente l'invio alla console quando un utente inizia a digitare, quindi attiva una "modalità interattiva.
  2. All'avvio del server, è necessario aprire una "porta amministrativa" che ascolti i comandi inviati da una console diversa. Quando vuoi inviare il comando shutdown devi usare un programma separato il client di amministrazione del server per permetterti di interfacciarlo con il server tramite la riga di comando (o un'interfaccia utente).
risposta data 04.03.2013 - 18:45
fonte
2

Non c'è un buon modo per fare ciò che vuoi fare.

Come hai notato, se permetti al logger di continuare il suo output mentre l'interprete dei comandi fa eco alla digitazione dell'utente, ottieni un pasticcio mischiato.

Il rovescio della medaglia è questo: se blocchi il registratore quando l'utente inizia a digitare, rischi di bloccare un messaggio IMPORTANTE, uno che richiede l'azione IMMEDIATA.

La risposta migliore è avere due (2) "console", visualizzate contemporaneamente, in modo da non dover bloccare il registratore.

Se non puoi farlo, perché (ad esempio), sei su una porta seriale raw, quindi l'opzione due è aggiungere priorità ai tuoi messaggi di output. Quando l'utente inizia a digitare, i messaggi non importanti vengono trattenuti fino al termine della digitazione. Messaggi importanti si aprono e poi l'interprete dei comandi ripete la sua linea fino a quel momento. Ciò richiederà una certa quantità di spazio del buffer per impilare i suoi messaggi mentre si gratta la testa.

PERSONALMENTE, se avessi intenzione di fare qualcosa del genere, avrei messo un timeout sui messaggi in attesa: se non ha terminato di digitare il suo comando in un certo periodo di tempo, i messaggi poco importanti precedentemente tenuti vengono fatti uscire e quindi la riga di comando fino a quel momento viene ridigitata.

Di solito, non vale la pena di evitare il missaggio del messaggio. Se hai un operatore dettagliato e un logger di messaggi dettagliato, hai problemi più grossi rispetto ai flussi di output misti.

    
risposta data 04.03.2013 - 20:59
fonte

Leggi altre domande sui tag