2017-07-26 4 views
0

私は、Linux上のttyデバイスが一度に1つのインスタンスからしかアクセスできないようにする必要があります。 これを行うには、flock()関数を実装しました。 しかし、私のテストでは、flock()ロジックがなくても、別のプロセスからシリアルポートを開くことができませんでした。同時に複数のプロセスからttyを開くことは可能ですか?

これはすべての場合の通常の動作であるかどうか疑問に思っていますので、flock()ロジックを削除し、ブロックopen()のロジックに頼ることができますか?いずれにしても、異なるインスタンスから同時にシリアルポートを開くことは可能ですか?

EDIT:

私はflock()ロジックなしで同時にTTYポートを複数回開くことが実際に可能であることを考え出しました。 しかし、open()の機能は、flock()によってブロックされているようです。

答えて

1

通常、複数のプロセスから同時にシリアルデバイスを開くことは可能です。

あなたが排他的アクセスを得るためにTIOCEXCLioctl()を使用することができます。

ioctl(fd, TIOCNXCL); 

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) */ 
} 

と再可能にする他のopen() sまでをこの関数には<sys/ioctl.h>を含める必要がありますし、定数の場合は<termios.h>です。

多くのLinuxシリアルライブラリはすでにこれを行っています。いくつかのシリアルドライバは一度に1つだけ開くことができるかもしれませんので、あなたが見ている動作の理由を判断するために、私はより多くの詳細が必要です(シリアルデバイスを開く方法、特に)。

個人的に - と私は、これはほとんどのLinuxのシリアルライブラリが何をすべきかであると考えていない - 、私はあなたがioctl(fd, TIOCEXCL)、多分を試してみてくださいお勧めします、それが失敗した場合、ユーザーに警告する(それが0を返した場合、成功、-1さもないと);すべての場合、ioctl(fd, TIOCNXCL); close(fd);を使用してttyを閉じます。

関連する問題