代码之家  ›  专栏  ›  技术社区  ›  Peeter Joot

Unix的线程安全路径比较或规范化函数?

  •  0
  • Peeter Joot  · 技术社区  · 14 年前

    • 剥离最后一个路径组件以获取仅目录部分:/foo/bar->/福
    • getcwd并记住原始路径
    • getcwd并记住返回调用者
    • chdir旧原始路径

    互斥可以减少代码序列的线程不安全性,但这并不理想(您必须知道,使用getcwd或其他依赖于进程cwd的函数的所有其他代码(包括系统和供应商代码)都使用相同的互斥来保护)。

    4 回复  |  直到 14 年前
        1
  •  2
  •   David Gelhar    14 年前

    那怎么办 realpath(3)

    因为它在您提供的缓冲区中返回结果,所以线程安全不应该成为问题。

        2
  •  2
  •   Dan Breslau    14 年前

    尝试 realpath() canonicalize_file_name()

    realpath(pathname, NULL) ; 这将 malloc 规范化文件名的缓冲区,并将其作为返回值传回。你一定要这么做 free() 指针。另一种方法是传入一个输出缓冲区,这样会有缓冲区溢出的风险。

    规范化\u文件\u名称() 是一个Gnu扩展,相当于 realpath(路径名,NULL)

        3
  •  0
  •   Lie Ryan Bryan    14 年前

    Unix目录中没有“规范”路径。一个文件/目录可能有多个硬链接/装入点。

    最接近文件/目录标识的是它的inode。

        4
  •  0
  •   Community CDub    7 年前

    相关岗位:

    尝试此操作以转换相对文件路径,然后将它们作为字符串进行比较:

    #include<stdio.h>
    #include<dirent.h>
    #include<fcntl.h>
    #include<sys/param.h>
    int main( int argc, char **argv )
    {
      char buffer[MAXPATHLEN+1];
      if( argc <= 1 ) return 0;
      DIR*d = opendir( argv[1] );
      if( !d ) return 0;
      int dfd = dirfd(d);
      if( !dfd ) return 0;
      int result = fcntl( dfd, F_GETPATH, buffer );
      if( result == -1 ) return 0;
      fprintf( stdout, "path='%s'\n", buffer );
      return 0;
    }