2015-05-19 17 views
5

L'obiettivo è quello di "bloccare" l'accesso a un dispositivo seriale o altro dispositivo Linux, per garantire l'accesso esclusivo al dispositivo mentre è in uso. Ciò impedisce, ad esempio, due programmi che aprono entrambi lo stesso dispositivo seriale e "competono" per leggere byte dal dispositivo.Qual è la procedura migliore per bloccare porte seriali e altri dispositivi in ​​Linux?

Il consiglio è stato quello di utilizzare i file di blocco dispositivo UUCP in stile SYSV come /var/lock/LCK..ttyS1. Questo è ciò che è raccomandato da Linux Serial HOTWO: Locking Out Others. È anche documentato nello Filesystem Heirarchy Standard. È implementato da programmi terminali seriali come gtkterm, picocom. Esistono librerie come liblockdev e liblockfile per supportarlo (sebbene i dettagli di implementazione differiscano tra queste due librerie).

Tuttavia, ho trovato Debian bug #734086, che dice su Linux, i blocchi di dispositivo UUCP in stile SYSV sono deprecati e dovrebbero essere usati i blocchi di avviso flock().

Tuttavia, non riesco a trovare un'origine di documento affidabile per descrivere la deprecazione di questi blocchi di dispositivi UUCP in stile SYSV e la raccomandazione di flock(), oltre a quella di bug di Debian.

Ho anche trovato ioctl(fd, TIOCEXCL) che viene utilizzato dall'utilità screen per bloccare un terminale.

Qual è la "best practice" moderna per bloccare porte seriali e altri dispositivi in ​​Linux? Dove possiamo trovare la documentazione aggiornata che descrive questo?

+0

Vedo che questo ha attirato un voto ravvicinato a causa dell'essere "principalmente basato sull'opinione pubblica". Tuttavia, affinché il blocco della porta seriale funzioni utilizzando qualcosa come i file di blocco UUCP o 'flock()' (entrambi sono "advisory"), è importante che tutti i programmi utilizzino lo stesso metodo, altrimenti il ​​blocco non funzionerà. Per esempio. se un programma utilizza i blocchi di file UUCP e un altro utilizza 'flock()', allora il blocco è inefficace ed entrambi possono aprire la porta. Quindi questa è una domanda pragmaticamente importante per ottenere consenso nella comunità Linux. –

risposta

1

Per quanto ne so, usare il blocco flock() di porte seriali o altri dispositivi è probabilmente la migliore via da percorrere in Linux, seguendo il comando di Debian in Debian bug #734086. Nota che l'originale sostenitore di questo cambiamento di Debian, Roger Leigh, si è trasferito da Debian e Linux e su FreeBSD nel 2014/2015 (vedi his comments here). Ma Debian sembra attenersi al metodo flock(), quindi vale la pena qualcosa.

Tuttavia, data la scarsa comunicazione di questo cambiamento con la più ampia comunità Linux a questo punto, potrebbe essere opportuno supportare i vecchi file di blocco dispositivo UUCP in stile SYSV (/var/lock/LCK..ttyS1) come opzione di compilazione, da utilizzare in i sistemi utilizzano ancora il metodo di blocco precedente.

E.g. picocom è ora passato all'utilizzo del metodo flock(), con una selezione facoltativa in fase di compilazione dei file di blocco del dispositivo UUCP in stile SYSV.

Vorrei presentare un aggiornamento al Serial HOWTO su questo (dato che è il primo risultato di ricerca di Google per "Linux serial lock"), ma al momento è difficile aggiornare i documenti sul sito Web LDP a causa della sua attuale stato di manutenzione.

Problemi correlati