/ / Riattivazione della porta seriale di blocco letta in Linux - c, linux, porta seriale

Attivare il blocco della porta seriale in Linux - c, linux, porta seriale

Io uso la chiamata select () per bloccare indefinitamenteuna porta seriale fd in un thread dedicato che legge costantemente i dati. Non riesco a trovare un modo per svegliarmi dalla mia chiamata selezionata (a meno che non imposti un timeout, ecc.) Nella programmazione di socket hai la chiamata shutdown () per riattivare qualsiasi thread bloccato su select ().

Con le porte seriali, però, non ne vedoanalogica. Chiamare close () da un altro thread mentre il mio thread "reader" è bloccato su select () non sembra essere un comportamento ben definito su POSIX. Su Linux in particolare, chiamare close () su un fd non sveglierà i thread che hanno chiamato select () su quel fd. From (http://linux.die.net/man/2/select):

Se un descrittore di file viene monitorato da select ()è chiuso in un altro thread, il risultato non è specificato. Su alcuni sistemi UNIX, select () sblocca e restituisce, con un'indicazione che il descrittore di file è pronto (una successiva operazione di I / O probabilmente fallirà con un errore, a meno che un altro il descrittore di file venga riaperto tra il tempo selezionato () restituito e il Sono state eseguite operazioni di I / O). Su Linux (e altri sistemi), la chiusura del descrittore di file in un altro thread non ha alcun effetto su select (). In sintesi, qualsiasi applicazione che si basa su un particolare comportamento in questo scenario deve essere considerata buggata.

E 'possibile risvegliare un thread bloccato indefinitamente su una porta seriale fd in Linux, e se sì, come?

modificare:

C'è un modo di "hacking" per aggirare questochiamare select () in un ciclo con sleep () (questo non è ideale anche se ora c'è un ritardo tra una richiesta di attivazione e il thread che si sta effettivamente risvegliando). C'è qualche cosa di dannoso nel chiamare select in loop system?

risposte:

0 per risposta № 1

Due soluzioni tipiche:

  1. Crea una pipe e aggiungila per selezionare la coda. Non appena invii i dati su questa pipe, seleziona le uscite.

  2. Se svegliare tutti i thread non è un problema, puoi inviare un segnale.