[英]How to use relative paths in general C program?
我創建了一個 C 程序,我想將它發布到 Homebrew,因此它需要能夠從任何工作目錄運行(通過用戶路徑中的符號鏈接)。
該程序使用相對路徑(相對於代碼)進行文件寫入,我不確定如何設置它以便相對路徑能夠工作,無論程序從哪個位置運行。 (使用絕對路徑似乎不是一種選擇,因為它需要在任何人的系統上運行)。
請有人可以就如何解決這個問題提供一些一般性指導嗎?
提前謝謝了。
在 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] = '\0';
printf("[%s]\n", buff);
}
生成以下 output:
[/home/pax/]
對於 MacO,這是相同的理論,但您可能不一定有可用的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
header ( getpid
已作為unistd.h
的一部分包含在內)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.