【问题标题】:Why does the realpath function not work in Cygwin?为什么 realpath 函数在 Cygwin 中不起作用?
【发布时间】:2019-07-04 09:06:37
【问题描述】:
char *path = "somefile.txt";
char resolved[PATH_MAX] = {0};
realpath(path, resolved);

printf("path is %s, resolved path is %s", path, resolved);

在linux env中,一切正常,但是如果是在cygwin env中构建的,resolved是“”(空),为什么?

【问题讨论】:

  • 您是否按照此处所述检查了 errno:man7.org/linux/man-pages/man3/realpath.3.html
  • @mbieren 它打印“没有这样的文件或目录”
  • 错误信息似乎很清楚。您是否声称文件“somefile.txt”实际上存在于当前目录中?
  • @varro 文件不存在。但即使文件不存在,realpath 也应该返回到 ${current-folder}/somefile.txt 的路径。它在 linux 环境下工作。
  • 尝试为第二个参数传递 NULL 并使用 realpath() 的返回值。参见例如man7.org/linux/man-pages/man3/realpath.3.html 当返回值为 NULL 时,使用例如perror() 打印错误状态消息。确保 free() 任何非 NULL 返回值。请注意,将非空值作为第二个参数传递是不安全的,因为没有缓冲区长度检查,如果您的分配小于内核的 PATH_MAX 概念,则允许重写数据。还要注意 cygwin 使用 newlib,而不是 glibc,因此实现可能与 linux 不同。

标签: c cygwin realpath


【解决方案1】:

realpath 函数的来源在文件 canonicalize.c 中。有这样的代码:

if (resolved == NULL)
{
    rpath = malloc (path_max);
    if (rpath == NULL)
    return NULL;
}
else
    rpath = resolved;

我认为您用于数组resolved 库函数的初始化 被视为NULL 并且没有保存到其中。 尝试初始化

char *resolved;
resolved=malloc(PATH_MAX);

 /* SOME CODE  */

free(resolved);

【讨论】:

  • 我认为 malloc(PATH_MAX) 在这种情况下与 char[PATH_MAX] 没有区别。
  • 是的,它又失败了。
  • Linux 使用 GNU 'libc.so' 。 CYGWIN 使用自己的,与 GNU 不兼容的库 'cygwin1.dll'。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2022-11-12
相关资源
最近更新 更多