Linux で root として実行され、tty (実際には tty として実装された LCD) と通信するプログラムがあります。価値のあるデバイスは /dev/ttyUSB0 です。同時に実行されているプログラムの他のインスタンスから干渉されないように、このデバイスに書き込むプログラムがデバイスに排他的にアクセスできるようにしたいと考えています。
TIOCEXCL ioctl が発行されない限り、同じファイルへの複数の open() 呼び出しが成功することを意味するデバイスの追加のオープンを防止する TIOCEXCL と呼ばれる ioctl オプションがあることがわかります。これにより、ルート所有プロセス以外による追加のオープンが防止されます。 " これをテストしたところ、宣伝されているとおりに動作します。root 以外のユーザーが /dev/ttyUSB0 を開こうとすると (パーミッションを変更したら)、「デバイスがビジー状態」などで失敗し、root ユーザーが開こうとすると失敗します。 、 できます。
私が理想的に望んでいるのは、この tty への排他的アクセスを root ユーザーのために機能させる方法です。そのため、複数の root ユーザーが LCD に書き込むプログラムを使用することになりますが、どういうわけか彼らの LCD (tty) へのアクセスはシリアル化されます。どうやら TIOCEXCL ioctl オプションは、root ユーザーが既に開いている tty デバイスを開くのを止めないので、私にはうまくいきません。
ここには多くのオプションがあると思いますが、他の考えや提案があるかどうかを確認するために、すべての人に連絡しています.
たぶん、TIOCEXCLの使用について何かが欠けています...
open() や ioctl() などを介して排他的アクセスを取得する方法が他にあるかもしれません。
他のプロセスがデバイスを開いていることを検出できる方法があれば、待ってから再試行できます。私は lsof について知っていますが、これを学ぶためだけにこのプログラム内から呼び出すのは嫌です。そして、それには競合条件があります。(多分私はそれを乗り越えることができますか?:))
tty デバイスへの排他的アクセスを取得するために使用されていたように、ロックを実装できます。
更新 1:
LCD デバイスに書き込むプログラムは私のものだけなので、次のようなコード (疑似コード) を実行してコード内にロックする傾向があります。
f = open("/dev/ttyUSB0", O_RDWR)
flock(f, LOCK_EX)
// do any ioctl's, etc.
// do any write's
// sleep a tad to not flash messages too fast on LCD
nanosleep({0, 250000000}, NULL)
flock(f, LOCK_UN)
close(f)