C獲取程式名稱的方法

唐青枫發表於2024-11-10

方法一:

使用 extern char *__progname

介紹:

__progname 是一個定義在C標準庫中的特殊的全域性變數,持有當前執行程式的名稱,它僅在類Unix系統中可用,如:Linux、MacOS。

解析:

  • extern:的含義是宣告此變數是定義在其他地方,通常是在C執行時中。
  • char *__progname:表示為一個指向字元陣列的指標,值包含正在執行的可執行檔案的名稱
  • __progname:的值通常不是檔案的全路徑,僅包含檔案的名稱,如:/usr/bin/myapp,則 __prognamemyapp

使用示例:

#include <stdio.h>

extern char *__progname;

int main(void) {
    printf("This program is called: %s\n", __progname);
    return 0;
}

方法二:

使用 argv[0] 獲取

介紹:

這是通用獲取程式名稱的方式,在類Unix系統和Windows系統中都可以用。

解析:

如果只聚焦與類Unix平臺,不相容擴平臺,直接使用 __progname 的方式比較方便,argv[0] 需要顯式的在方法中指定引數。

使用示例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Program name: %s\n", argv[0]);
    return 0;
}

方法三:

使用 /proc/self/exe 獲取

介紹:

此方法只能在Linux系統中使用,透過讀取 /proc/self/exe 這個軟連結來獲取程式的執行路徑。

解析:

/proc/self/exe 是一個指向當前程序的可執行檔案的軟連結。

proc 牽扯到虛擬檔案系統(提供程序和系統的資訊)

self 實際上是指向當前執行程序的PID,例如當前的PID是:1234,則 /proc/1234/exe/proc/self/exe 相等。

使用示例:

#include <stdio.h>
#include <unistd.h>

int main() {
    char path[1024];
    ssize_t len = readlink("/proc/self/exe", path, sizeof(path) - 1);
    if (len != -1) {
        path[len] = '\0';  // Null-terminate the string
        printf("Executable path: %s\n", path);
    } else {
        perror("readlink");
    }
    return 0;
}

方法四:

使用 GetModuleFileName API獲取

介紹:

此方法只能在Windows系統中使用。

解析:

GetModuleFileName 可以獲取到可執行檔案的完整路徑

使用示例:

#include <windows.h>
#include <stdio.h>

int main() {
    char path[MAX_PATH];
    GetModuleFileName(NULL, path, MAX_PATH);
    printf("Program path: %s\n", path);
    return 0;
}

番外:

如何下載獲取到C執行時的原始碼

  • 使用包管理器下載,如在Debian/Ubuntu系統中
sudo apt-get source libc6
  • 從官網下載壓縮包

https://www.gnu.org/software/libc/

  • 從Github映象倉庫中下載
git clone https://github.com/bminor/glibc.git

相關文章