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();    
}

 

转载于:https://www.cnblogs.com/philipce/p/6821433.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值