【问题标题】:C, Linux, getcwd/chdir(): get binary pathC、Linux、getcwd/chdir():获取二进制路径
【发布时间】:2011-03-28 23:55:43
【问题描述】:

我想打开一些与二进制文件位置相关的文件(log4cxx 配置、其他日志等)。

不幸的是,getwd() 和 getcwd() 都给了我目录,我尝试从该目录以已知路径运行二进制文件,而不是给我二进制文件所在的路径(以及数据所在的位置)。

如何获取应用程序的路径以与chdir() 一起使用?除了argv[0] 之外的任何方法并且不尝试解析 /proc/$PID/(这还不够便携)?

【问题讨论】:

  • Windows 知道执行二进制文件的目录,但 Unix 不知道。
  • # ls -la /proc/1027/|grep exe lrwxrwxrwx 1 root root 0 Mar 29 03:13 exe -> /sbin/udevd
  • Linux 可能会跟踪它,但这不是标准的 Unix 功能。

标签: c++ chdir getcwd


【解决方案1】:

遍历 PATH 并找到与 argv[0] 同名的可执行文件?

但是,为用户提供一种配置数据位置的方法可能会更好。环境变量或配置文件或 CL 参数或某事。处理那些试图提供帮助但实际上很愚蠢的程序非常令人沮丧。

【讨论】:

  • 好吧。大老板喜欢简单的东西:) 如果没有可移植的解决方案,将使用简单的 .sh/.bat 包装器。
  • 为什么你的日志是相对于二进制位置的。日志应该在 /var/log/ 中。普通用户将没有适当的权限来修改二进制文件的本地文件。
  • 持久性日志和数据确实存储在 /var/ 中,但在调试阶段使用了一些临时文件,更改此设置将重新引入在每次 svn 提交后重新部署整个应用程序的成本 - 太多时间花在其他事情上。
  • 不幸的是,'which' 在所有 unice 上的工作方式都不同。我认为是 Solaris 做了一些奇怪的事情。
  • 是的,但在那种情况下不会 argv 持有路径?也许不是。
【解决方案2】:

这正是autoconf 所追求的目标,如果您希望编写您的软件的程序员以外的任何人使用它,那么支持这些标准目录几乎是强制性的。一旦设置正确,要在主目录之外进行调试,您只需将不同的--prefix= 值传递给configure。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2011-04-22
    • 2010-09-08
    • 2018-12-28
    相关资源
    最近更新 更多