问题描述
nftw("/sys/class/tty",opearate_on_tty_item,1,flags)
和函数 nftw()
对其在文件夹 operate_on_tty_item()
中找到的每个项目执行函数 /sys/class/tty
。
函数 operate_on_tty_item()
直接从 nftw()
获取参数,并检查当前 /sys/class/tty/<device>
设备是否有子文件夹 device/driver
(这意味着它是一个物理设备) 并以稍微不同的格式打印此设备,即 /dev/<device>
。函数本身看起来像这样:
static int opearate_on_tty_item(const char *path,const struct stat *buffer,int flags,struct FTW *ftw_structure)
{
max_sub_directories = 1;
// If depth is higher than max_sub_directories,ignore this field and advance to the next file.
if (ftw_structure->level > max_sub_directories) {
// Tell nftw() to continue and take next item.
return 0;
}
// Concatenate string of the object's path,to which we append "/device/driver".
strcat(directory_concatenation,path);
strcat(directory_concatenation,"/device/driver");
// Open the directory stored in concatenated string and check if it exists
if ((directory = opendir(directory_concatenation))) {
// Reset concatenated string to null string.
directory_concatenation[0] = '\0';
// Concatenate string.
strcat(directory_concatenation,"/dev/");
strcat(directory_concatenation,path + ftw_structure->base);
printf("%s\n",directory_concatenation);
}
// Close the opened directory.
closedir(directory);
// Reset concatenated string to null string.
directory_concatenation[0] = '\0';
return 0;
}
这里我不明白的是:
strcat(directory_concatenation,path + ftw_structure->base);
这一行总结了 const char * path
和 ftw_structure->base
。但是后面的printf()
printf("%s\n",directory_concatenation);
打印一个字符串(例如/dev/ttyUSB0
)!这怎么可能?这个字符串是如何使用常量字符指针和整数的求和运算创建的?
我完全糊涂了,因为 FTW 成员 FTW.base 是在 POSIX 标头 ftw.h
中这样定义的(它是一个整数):
/* Structure used for fourth argument to callback function for `nftw'. */
struct FTW
{
int base;
int level;
};
那么符合 POSIX 标准的系统是如何知道显示字符串的呢?这是如何计算的?
解决方法
这怎么可能?
似乎 directory_concatenation
是一个指向包含 /dev/ttyUSB0
后跟零字节的内存的指针。
这个字符串是如何使用常量字符指针和整数的求和操作创建的?
将整数的值与指针存储的地址相加,使指针值递增。因为来自文档:
nftw() 在调用 fn() 时提供的第四个参数是 FTW 类型的结构:
struct FTW {
int base;
int level;
};
base 是文件名(即 basename 组件)在
fpath
中给出的路径名。 [...]
计算的结果是一个指向表示路径文件名的字符串的指针。然后strcat
在directory_concatenation
指针所指向的内存中找到第一个零字节,复制表示该文件名的字节,一个字节一个字节地到从零开始的位置directory_concatenation
指向的内存中的字节位置。尾随的零字节也被复制,从而创建一个新的字符串,将文件名的值连接到前一个字符串。