1. 程式人生 > >Linux下獲取可執行程序的絕對路徑

Linux下獲取可執行程序的絕對路徑

出錯 處理 其他 但是 源文件位置 應該 out 絕對路徑 class

編寫的程序中如果需要讀取配置文件,或者需要輸出log文件打印日誌,或者讀取其他文件的時候會出現一個問題:

可執行程序在讀取文件路徑的時候使用什麽路徑?

我們一般項目的結構就是:

project/

bin/ 可執行程序位置

conf/ 配置文件位置

log/ 日誌文件位置

include/ 頭文件位置

src/ 源文件位置

obj/ 臨時工程文件位置,即.o 文件

other/ 其他一些文件

所以在寫程序的時候我們一般使用相對路徑去讀取配置文件,或者log文件的位置,因為項目的結構是固定的,這樣項目整個移植到別的地方的時候也比較容易處理,不會出錯。

但是使用相對路徑,例如 fp = open("../log/program.log"); 會帶來一個問題,如果可執行程序是被project 目錄以外的其他位置的腳本調用的時候,那麽可執行程序運行的位置是在shell腳本所在的位置,就不在是project/bin/目錄了,當然那些相對的log,conf 路徑也都不存在了。

所以在編寫程序的時候應該獲取可執行程序的原始位置,在使用其他文件的時候在文件路徑上加上這個可執行程序的絕對路徑,這樣就保證了可執行程序能夠正確的訪問到相對路徑下的log文件等等。

string GetOwnerPath()
{
    char path[1024];
    int cnt = readlink("/proc/self/exe", path, 1024);
    if(cnt < 0|| cnt >= 1024)
    {
        return NULL;
    }
//最後一個‘/‘ 後面是可執行程序名,去掉可執行程序的名字,只保留路徑
    for(int i = cnt; i >= 0; --i)
    {
        if(path[i]==/)
        {
            path[i + 1]=\0
; break; } } string s_path(path); //這裏我為了處理方便,把char轉成了string類型 return s_path; }

相應的log文件讀取的時候就可以寫成:

void Log(string &s_message)
{
    ofstream logfile;
    string path = GetOwnerPath();     //獲取可執行程序的絕對路徑位置
    path += "../log/program.log";     //拼接路徑,獲得log文件的絕對路徑
    logfile.open(path.c_str(), ios::app);
    if(logfile.is_open())
    {
        logfile.write(s_message.c_str(), s_message.size());
    }
    else
    {
        cout << "Cannot open log file, please check its path!" << endl;
    }
    logfile.close();    
}

Linux下獲取可執行程序的絕對路徑