Come faccio a rilevare quando qualcuno apre il lato schiavo di un PTY (pseudo-terminale) in Linux?

StackOverflow https://stackoverflow.com/questions/3486491

Domanda

Avere più di un processo letti da un dispositivo seriale (/ dev / ttyXX) fa in modo che entrambi i processi non possono ottenere tutti i dati - i dati saranno divisi tra loro in qualche modo. Mi piacerebbe scrivere un programma che legge da un dispositivo seriale, crea diverse paia PTY master / slave, e quindi consente ai programmi che sono state fatte per leggere dal dispositivo seriale al posto letto dal PTY in modo che tutti i processi di lettura ricevono i dati dal dispositivo seriale e hanno i PTY si comportano come il dispositivo seriale, nel senso che quando iniziano la lettura dal Pty ottengono solo i dati più recenti. In altre parole, non sarà possibile ottenere alcun dato che è stato scritto prima di iniziare a leggere (è la mia esperienza che questo è come / dev / ttyXX dispositivi di lavoro, o almeno la RS-232 anemometro che sto leggendo da). Le named pipe possono mimare queste semantica intrappolando SIGPIPE per stabilire che non v'è nessun lettore, e quindi siamo in grado di scegliere di non scrivere in quel particolare named pipe. Tuttavia, alcuni file binari che sono stati scritti per utilizzare i terminali potrebbero non riuscire quando si parla di named pipe, come i controlli per isatty () e la condizione errno sulle chiamate come tcsetattr () può causare condizioni fallendo. La chiave qui è di essere in grado di utilizzare i binari esistenti che sono stati scritti per un terminale.

Quindi, se riesco a rilevare quando il lato slave del PTY viene aperto per la lettura, questo dovrebbe darmi all'incirca la stessa semantica come non essendoci SIGPIPE nel caso named pipe. Ho notato che HP-UX ha TIOCTRAP come comando ioctl (), che sembra fare esattamente quello che voglio, ma purtroppo non è disponibile su Linux.

Ho letto riferimenti per giorni e il numero di opzioni per questo tipo di cosa è sconcertante. La risposta potrebbe trovarsi nelle impostazioni del terminale, bloccando / comportamento non bloccante, modificando tampone dimensioni da qualche parte, condizioni presentate da poll () / selezionare (), o una combinazione. Non riesco a trovare nulla, però. Mi chiedo se è possibile che ho bisogno di scrivere il mio driver di periferica, ma sembra che dovrei essere in grado di fare questo senza andare così lontano.

Quindi, per chiarimenti:
? - La domanda è: come posso rilevare quando qualcuno apre il lato schiavo di un PTY (pseudo-terminale) in Linux
- Voglio un lettore aprendo il lato slave del PTY per ricevere i dati scritti rigorosamente dopo il lettore apre il PTY (se il mio multi-processo di scrittura scrive solo i dati per un po 'prima che il lettore apre il lato slave, i dati del buffer e alla fine lo scrittore bloccherà e il lettore schiavo, al momento dell'apertura, immediatamente ottenere tutti i dati nel buffer - questo non è auspicabile in quanto lo voglio per ottenere solo i dati generati in prossimità temporale immediato)
- E ' deve essere un PTY, non una named pipe, socket, ecc, come isatty () e tcsetattr (), ecc bisogno di essere OK in modo che i binari esistenti lavoro

È stato utile?

Soluzione

Il motivo non è possibile trovare questo è perché non c'è alcuna interfaccia documentata specificamente per lo permette. Tuttavia, v'è un trucco che permette di farlo. Dopo aver aperto il master pseudo-terminale (presume qui per essere un file descrittore ptm), si apre e chiudere immediatamente il lato slave:

close(open(ptsname(ptm), O_RDWR | O_NOCTTY));

Questo imposta il flag HUP sul master TTY. A questo punto è polling bandiera HUP regolarmente con poll() (ad esempio, ogni volta che i dati provengono dall'origine dati):

struct pollfd pfd = { .fd = ptm, .events = POLLHUP };
poll(&pfd, 1, 10 /* or other small timeout */);

if (!(pfd.revents & POLLHUP))
{
    /* There is now a reader on the slave side */
}

Se il lettore va mai via, POLLHUP verrà impostato di nuovo.

Nel tuo caso, probabilmente non hanno nemmeno bisogno di ricordare da un ciclo al successivo se un determinato Pty dispone di un lettore - solo blocco sulla read() della sorgente di dati, poi, quando i dati sono disponibili, contemporaneamente poll() tutta la vostra ttys master e inviare i dati a nessuno di loro che non hanno impostato POLLHUP.

Altri suggerimenti

Aggiungi un orologio inotify sulla Pty schiavo e sondaggio su questo. È possibile ottenere un evento inotify sulla aperta. È quindi possibile eseguire il polling sul descrittore di file inotify e il descrittore di file pty master. È possibile ottenere un evento inotify per aprire (IN_OPEN). Ciò sbloccare il sondaggio quando il lato slave è aperto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top