PDA

View Full Version : [c] terminare un programma multithread controllando il SIGINT


agosteeno
09-09-2011, 18:32
Salve, ho un programma fatto in questo modo:
- un thread main che esegue alcune operazioni di inizializzazione, crea altri 2 thread e poi fa' una join su questi 2
- un thread input che si mette in lettura sullo stdin per ricevere alcuni comandi dall'utente (con una fgets) e se riceve un particolare comando oppure un EOF (ctrl-d) deve terminare.
- un thread output che e' in ascolto su una socket (in attesa su una accept per essere precisi) per ricevere la risposta ai comandi richiesti dall'utente.

Il thread input esegue un ciclo infinito controllato da una variabile globale.
Il thread output esegue un ciclo infinito controllato dal risultato della accept

Quando invio un SIGINT il gestore di questo segnale fa' terminare la accept (e quindi uscire dal ciclo) il thread output, setta al valore opportuno la variabile per il thread input, ma non mi consente di farlo uscire dalla fgets nella quale e' in attesa.
Nel codice del gestore ho provato a mettere una write su stdin che scrive il comando di chiusura, ma in realta' non succede nulla...
Qualcuno ha idea di come possa fare per far leggere a questa fgets una stringa particolare (o anche inviargli un EOF) tenendo in conto che si possono usare solo funzioni signal-safe (si tratta di un gestore di segnale).

WarDuck
10-09-2011, 20:37
Io userei una select, che ti consente di stare in attesa da pių fonti (ad esempio socket o standard input), cosė facendo potresti mandargli un messaggio tramite socket (l'EOF famoso).

Questa č la prima cosa che mi č venuta in mente, prendila come tale :D.

agosteeno
10-09-2011, 21:26
la select nn la devo usare. Trattandosi di un compito d'esame devo attenermi al programma e l'uso della select non e' previsto. Cmq credo di aver risolto usando una catena di eventi un po' particolare che riesce a chiudere il tutto. Grazie cmq. Ciao!