3

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 デバイスを開くのを止めないので、私にはうまくいきません。

ここには多くのオプションがあると思いますが、他の考えや提案があるかどうかを確認するために、すべての人に連絡しています.

  1. たぶん、TIOCEXCLの使用について何かが欠けています...

  2. open() や ioctl() などを介して排他的アクセスを取得する方法が他にあるかもしれません。

  3. 他のプロセスがデバイスを開いていることを検出できる方法があれば、待ってから再試行できます。私は lsof について知っていますが、これを学ぶためだけにこのプログラム内から呼び出すのは嫌です。そして、それには競合条件があります。(多分私はそれを乗り越えることができますか?:))

  4. 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)
4

5 に答える 5

7

おそらく、LKML に関するこのディスカッション: [TTY] 排他モードの質問が役に立ちます!

于 2009-03-27T23:03:57.910 に答える
1

私はあなたのような問題を抱えています。Linuxカーネルをハックできるなら、このようなダーティハックを行うことができます。ファイル内

linux/drivers/char/tty_io.c

関数に新しいコマンドを追加する

long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
    ...
    switch (cmd) {
    ...
    case 0x54FF:
        return put_user(tty->count, (int __user *)p);
    ...
}

の値tty->countは、現在開いている記述子の数です。

アプリケーションでこのコードを試すことができます

int fd, count, res;
fd = open("/dev/ttyS0", O_RDWR|O_NOCTTY|O_NONBLOCK);
if (fd >= 0)
{
    count = 0;
    res = ioctl(fd, 0x54FF, &count);
    if (res>=0)
    {
        if (count > 1)
        {
            printf("Device already in use.\n")
            close(fd);
            fd = -1;
        }
    }
}
于 2014-12-02T10:41:17.613 に答える
0

回答: root は常にアクセスできます。いつも。

おそらく、他に何がデバイスをつかんでいるのか、またはデバイスをつかむ可能性があると恐れているものについてもっと言ったら...

于 2009-03-27T23:42:22.297 に答える
0

I would encourage you to look into UUCP locking. There should be a library on Linux that implements it, but if not, it's fairly easy to implement. I've used it extensively in similar situations where I don't want multiple instances of the same program to step on each other.

As a side note, perhaps you should rethink the architecture of your solution. The process that accesses the LCD/ttyUSB0 could act as a server and handle messages from the client processes that need to write to the LCD. This would require some form of IPC. It may be overkill for your project.

Keep in mind that any solution you come up with will only work if all processes that access the device conform to the protocol. If you are worried about a rogue process running as root then you may be stuck with hacking the kernel to get the solution you want.

于 2009-08-11T18:12:10.650 に答える
0

すでに解決策を見つけたのか、デザインを変更しただけなのかはわかりませんが、「ルーツランド」での回避策は次のとおりです。

  1. システムに別のファイルを作成し、ポートと同じ名前にするか、ttyUSB0_islocked.
  2. ポートを開くときに、プロセスにこのファイルを検索/作成して開き、プロセスIDなどの情報を書き込みます。
  3. 他のプログラムでポートを開く前に、このファイルが存在するかどうか、ファイル内に同じプロセス ID を持つプロセスがあるかどうかを確認し、そのようなプロセスがない場合は続行するか、待機するか終了します。
于 2014-10-21T21:04:22.820 に答える