1.存在问题:
调用get_current_exe_path函数获取当前路径名时,发现路径名错误,路径名最后出现乱码。get_current_exe_path实现如下:
std::string get_current_exe_path() {
char buf[2048];
readlink("/proc/self/exe", buf, sizeof(buf));
return std::string(std::move(buf));
}
在调用readlink函数时,没有对读取的字节数进行处理,这可能导致缓冲区中的数据不完整;没有检查返回的字节数,也没有在缓冲区中添加终止符,这可能导致在构造std::string对象时出现问题。
2.解决方案:
在调用readlink函数后,根据返回的字节数来手动添加终止符,并将buf中的内容复制到std::string对象中:
std::string get_current_exe_path() {
char buf[2048] = {0};
ssize_t len = readlink("/proc/self/exe", buf, sizeof(buf)-1);
if (len != -1) {
buf[len] = '\0'; // 添加终止符
return std::string(buf); // 将buf中的内容复制到std::string对象中
} else {
// 处理错误的情况
return ""; // 或抛出异常,或返回一个特定的错误值
}
/proc/self/exe:要读取符号链接的路径名。
buf:用于存储符号链接内容的缓冲区。
sizeof(buf)-1:缓冲区的大小,减去 1 是为了确保缓冲区有一个额外的空间来存储字符串终止符 '\0'。
更新:char buf[2048]不够严谨
改成 char buf[PATH_MAX]
linux系统中,PATH_MAX是一个常量,表示文件路径名的最大长度。这个常量的值是系统定义的,通常是 4096。它用于指示文件路径名的最大字符数,以便在编程时分配足够的内存来存储路径名。