我创建了一个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
中(。