Linux下获取可执行程序的绝对路径

Posted 萨尔甘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下获取可执行程序的绝对路径相关的知识,希望对你有一定的参考价值。

编写的程序中如果需要读取配置文件,或者需要输出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下获取可执行程序的绝对路径的主要内容,如果未能解决你的问题,请参考以下文章

Linux下如何获取当前可执行文件的文件名

Linux下获取当前程序的绝对路径

linux下ld连接SO文件时如何制定绝对路径

工作问题经验整理——使用"/proc/self/exe"获取程序绝对路径

工作问题经验整理——使用"/proc/self/exe"获取程序绝对路径

QT如何修改编译后产生的可执行文件的路径》