例如,我打开了一个设备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岁左右。 但现在我正在寻找一种方法来做到这一点。 我找到了。 为了使用文件描述器获取设备节点,可以结合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; }