如何使用文件描述符获取设备的devnode

例如,我打开了一个设备arrays中的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?..谢谢。

做到这一点的正确方法是做自己的记账。 这将允许您完全按照用户提供的方式记录设备节点名称,而不是提供一个等效但易混淆的设备节点名称。

例如,您可以使用散列表 ,将文件描述符编号与用于相应open()调用的设备名称的char数组相关联。

一个更简单,但更脆弱和绝对推荐的解决方案可能涉及使用一个简单的char指针数组,大小过大,希望您可能遇到的任何文件描述符值都可以用作适当的索引字符串,而不超出数组范围。 这比散列表稍微容易一些,但是如果一个文件描述符的值超过了你的字符串数组允许的最大值,它将会导致程序死亡。

如果你的程序无论如何都绑定到Linux平台上,那么你可以通过使用/dev/fd目录或/proc文件系统(更具体地说是/dev/fd/proc/self/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()系统调用来检索与感兴趣的文件描述符相对应的链接的目标。

你需要fstat(2)系统调用,也许还需要fstatfs(2) 。 检查它是否成功。

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

请记住,您可以在/dev之外安装一个设备。 如果你确定你的设备在里面,你可以统计(2)其中的每一个条目,并比较它们的st_rdev

另请参阅高级Linux编程 (它在免费许可下在线,但您可能需要购买此书)。

那么我可以看到这个问题是1岁左右。 但现在我正在寻找一种方法来做到这一点。 我找到了。 为了使用文件描述器获取设备节点,可以结合statlibudev这里是一个例子:

 #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; }