簡體   English   中英

一般C程序中如何使用相對路徑?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM