今天改動一個程序,需要在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路徑執行,得到結果: