如何在一般的C程序中使用相对路径?

  • 本文关键字:相对 路径 程序 c path
  • 更新时间 :
  • 英文 :


我创建了一个C程序,我想将其发布到Homebrew,因此它需要能够从任何工作目录运行(通过用户PATH中的符号链接(。

该程序使用相对路径(相对于代码(进行文件写入,我不确定如何设置它以使相对路径正常工作,无论程序从哪个位置运行。(使用绝对路径似乎不是一种选择,因为它需要在任何人的系统上运行(。

请有人提供一些关于如何处理这个问题的一般指导吗?

提前非常感谢。

在 Linux 下,文件/proc/self/exe是指向实际运行的可执行文件的符号链接。因此,您可以使用它来确定可执行文件所在的目录,并从那里开始工作。

例如,此程序(可执行文件/home/pax/testprog(:

#include <stdio.h>
#include <unistd.h>
int main(void) {
// Buffer should be more robust in real program but read anyway.
char buff[1000];
ssize_t sz = readlink("/proc/self/exe", buff, sizeof(buff));
// Find final directory separator (from '/home/pax/testprog').
while (sz > 0 && buff[sz-1] != '/')
--sz;
// Truncate string to directory name only, and print.
buff[sz] = '';
printf("[%s]n", buff);
}

生成以下输出:

[/home/pax/]

对于MacOS,这是相同的理论,但您可能不一定有可用的procfs。但是,在该系统上,还有另一种获取路径的方法:

int proc_pidpath(
int pid,              // pid of the process to know more about
void * buffer,        // buffer to fill with the abs path
uint32_t  buffersize  // size of the buffer
);

因此,为了使用它,请替换:

ssize_t sz = readlink("/proc/self/exe", buff, sizeof(buff));

跟:

ssize_t sz = proc_pidpath(getpid(), buff, sizeof(buff));

尽管您可能还需要libproc.h标头(getpid已包含在unistd.h中(。

相关内容

  • 没有找到相关文章

最新更新