|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Aug 2009
Messaggi: 119
|
[c] terminare un programma multithread controllando il SIGINT
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). |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12835
|
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 ![]() |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Aug 2009
Messaggi: 119
|
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!
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:05.