微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

FTW->base 和一些字符串路径的总和如何返回一个字符串?

如何解决FTW->base 和一些字符串路径的总和如何返回一个字符串?

我这样调用 nftw() 函数

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 * pathftw_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 中给出的路径名。 [...]

计算的结果是一个指向表示路径文件名的字符串的指针。然后strcatdirectory_concatenation指针所指向的内存中找到第一个零字节,复制表示该文件名的字节,一个字节一个字节地到从零开始的位置directory_concatenation 指向的内存中的字节位置。尾随的零字节也被复制,从而创建一个新的字符串,将文件名的值连接到前一个字符串。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。