2017-07-26 4 views
0

Je dois m'assurer qu'un périphérique tty sous linux n'est accessible qu'à partir d'une instance à la fois. Pour ce faire, j'ai implémenté une fonction flock(). Cependant, dans mes tests, je n'ai pas pu ouvrir le port série d'un autre processus en même temps, même sans la logique flock().tty ouvert à partir de plusieurs processus simultanément possible?

Je me demande maintenant si c'est le comportement normal dans tous les cas afin que je puisse supprimer ma logique flock() et me fier à la logique de blocage open()? Est-il possible d'ouvrir un port série à partir d'instances différentes simultanément?

EDIT:

J'ai compris qu'il est en effet possible d'ouvrir le port tty plusieurs fois simultanément sans flock() logique. Cependant, il semble que la fonction open() soit bloquée en raison du flock().

Répondre

1

Normalement, il est possible d'ouvrir un périphérique série à partir de plusieurs processus simultanément.

Vous pouvez utiliser le TIOCEXCLioctl() pour obtenir un accès exclusif:

if (!ioctl(fd, TIOCEXCL)) { 
    /* Any further open() on the tty 
     that is currently open on descriptor fd 
     will fail with errno == EBUSY 
     (except for the administrator, with the 
     CAP_SYS_ADMIN capability) */ 
} 

et de rétrocéder les autres open() s,

ioctl(fd, TIOCNXCL); 

Vous devrez inclure <sys/ioctl.h> pour la fonction, et <termios.h> pour les constantes.

De nombreuses bibliothèques série Linux le font déjà. Certains pilotes série peuvent n'autoriser qu'une seule ouverture à la fois, aussi, pour déterminer la raison du comportement que vous voyez, j'aurais besoin de beaucoup plus de détails (comment ouvrir le périphérique série, et le pilote de périphérique série utilisé, particulier).

Personnellement - et je ne crois que c'est ce que la plupart des bibliothèques de série Linux ne -, je vous recommande d'essayer le ioctl(fd, TIOCEXCL), et peut-être avertir l'utilisateur si elle échoue (elle retourne 0 si le succès, -1 autrement); et, dans tous les cas, utilisez ioctl(fd, TIOCNXCL); close(fd); pour fermer le terminal.