0

たとえば、デバイスのアレイで2つのデバイスを開きました。

NODESは/dev/ ttyUSB0、/ dev/ttyUSB1などです。

#define MAXDEV 4
devlist[MAXDEV];
const char *devices[] = {"/dev/ttyUSB0","/dev/ttyUSB1");


for(loop =0; loop<sizeof(devices); loop++){

    fd= open(devices[loop]);

}

次に、それらをfdsのリストに追加します。

for(i=0; i<MAXDEV; i++){

if(devlist[i] != 0){
devlist[i] = fd;
fd = -1;
}

}

今、私はデータのためにデバイスで読みました。

    for(iter=0; iter<MAXDEV; iter++){

if(FD_ISSET(devlist[iter],&fds)){

if ((nbytes = read(devlist[iter], buf, sizeof(buf)-1)) > 0 && nbytes != 0)
                    {

                 buf[nbytes] = '\0';

                     printf("Data Received on Node ???");

                    }
                if(nbytes < 0){
                            printf("connection reset\n");
                            FD_CLR(devlist[iter], &fds);
                            close(devlist[iter]);
                            devlist[iter] = 0;

                        }
                        if(nbytes ==0){
                            printf("Device Removed on Node ???\n");


                        FD_CLR(devlist[iter], &fds);
                            close(devlist[iter]);
                            devlist[iter] = 0;

                        }
    }
}

fdを使用してデバイスノードを取得するにはどうすればよいですか?..ありがとうございます。

4

3 に答える 3

1

これを行う適切な方法は、独自の簿記を行うことです。これにより、同等でありながら紛らわしい異なる名前を提供するのではなく、ユーザーが指定したとおりにデバイスノード名をログに記録できます。

たとえば、ハッシュテーブルを使用して、ファイル記述子番号を、対応する呼び出しcharに使用されたデバイス名を持つ配列に関連付けることができます。open()

より単純ですが、はるかに壊れやすく、絶対にお勧めできないchar解決策は、遭遇する可能性のあるファイル記述子の値を適切な文字列へのインデックスとして使用できることを期待して、非常に大きなサイズのポインタの単純な配列を使用することです。配列の境界を超えることなく。これはハッシュテーブルよりもコーディングが少し簡単ですが、ファイル記述子の値が文字列配列で許可されている最大インデックスを超えると、プログラムがひどく死んでしまいます。

とにかくプログラムがLinuxプラットフォームにバインドされている場合は、ディレクトリまたはファイルシステム(より具体的には、通常はシンボリックリンクであるディレクトリ)を使用してチートできる可能性があります。どちらにも、ファイル記述子の値を、対応するファイルを開くために使用されたパスの正規バージョンに関連付けるシンボリックリンクが含まれています。たとえば、次のトランスクリプトについて考えてみます。/dev/fd/proc/proc/self/fd/dev/fd

$ ls -l /proc/self/fd
total 0
lrwx------ 1 user user 64 Nov  9 23:21 0 -> /dev/pts/10
l-wx------ 1 user user 64 Nov  9 23:21 1 -> /dev/pts/10
lrwx------ 1 user user 64 Nov  9 23:21 2 -> /dev/pts/10
lr-x------ 1 user user 64 Nov  9 23:21 3 -> /proc/16437/fd/

readlink()システムコールを使用して、対象のファイル記述子に対応するリンクのターゲットを取得できます。

于 2012-11-09T21:24:29.827 に答える
0

fstat(2) syscall、おそらくfstatfs(2)も必要です。成功したことを確認します。

  struct stat st;
  memset (&st, 0, sizeof(st));
  if (fstat (fd, &st))
    perror("fstat");
  else {
    // use st, notably st.st_rdev
  }

の外にデバイスがある可能性があることを忘れないでください/dev。デバイスがその中にあることが確実な場合は、その中のすべてのエントリをstat(2)して、それらを比較できます。st_rdev

Advanced Linux Programmingも読んでください(無料ライセンスの下でオンラインですが、本を購入することをお勧めします)。

于 2012-11-09T19:24:06.417 に答える
0

さて、この質問は約1歳です。しかし今、私はこれを行う方法を探していました。そして私はそれを見つけました。statファイル記述子を使用してデバイスノードを取得するには、組み合わせることができますlibudev。例を次に示します。

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <libudev.h>
#include <iostream>
#include <fcntl.h>


int main(int argc, char *argv[])
{
    struct stat sb;

    // Get a file descriptor to the file.
    int fd = open(argv[1], O_RDWR);

    // Get stats for that file descriptor.
    if (fstat(fd, &sb) == -1) {
        perror("stat");
        exit(EXIT_FAILURE);
    }

    // Create the udev context.
    struct udev *udev;
    udev = udev_new();

    // Create de udev_device from the dev_t obtained from stat.
    struct udev_device *dev;
    dev = udev_device_new_from_devnum(udev, 'b', sb.st_dev);

    // Finally obtain the node.
    const char* node  = udev_device_get_devnode(dev);

    udev_unref(udev);

    std::cout << "The file is in:    " << node << std::endl;

    return 0;
}
于 2014-05-08T15:13:34.080 に答える