linux c/c++獲取可執行程序的絕對路徑

     今天改動一個程序,需要在linux環境獲取執行程序的絕對路徑,搜索到兩個函數,在此做下記錄和對比。

      函數1:char *getcwd(char *buf, size_t size);

      頭文件:unistd.h

      獲取到可執行程序的絕對路徑,存放到buf中,size是指定的buf大小。若size指定的大小比 buf短,會返回NULL。若不知道buf的長度,可以設置size爲0,則getcwd會調用malloc動態給buf分配空間,不過後續要記得調用free釋放buf。

     不足:使用後發現,該函數返回的是執行可執行程序的絕對路徑。

 

    函數2:int readlink(const char * path ,char * buf,size_t bufsiz);

    頭文件:unistd.h

    該將參數path的符號連接內容存到參數buf所指的內存空間,返回的內容不是以NULL作字符串結尾。返回值即爲字段buf的長度。

若傳入的參數bufsiz小於符號連接的內容長度,過長的內容會被截斷。

  不足:這個函數並不是直接獲取程序的絕對路徑,是通過獲取當前程序的自身信息拿到的路徑。且得到的路徑包括了可執行程序名稱,需要再處理。

eg:在路徑/home/alex/test-getpath上寫了個測試代碼

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

int main()
{
    char szBuf[128];
    char szPath[128];
    
    memset(szBuf, 0x00, sizeof( szBuf));    
    memset( szPath, 0x00, sizeof(szPath));

    getcwd(szBuf, sizeof(szBuf)-1);
    printf("buf:%s\n", szBuf);

    int ret =  readlink("/proc/self/exe", szPath, sizeof(szPath)-1 );
    printf("ret:%d\n", ret);
    printf("path:%s\n", szPath);

    return 0;

}

若是在/home/alex/test-getpath路徑執行,得到結果:

若是在/home路徑執行,得到結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章