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();
}
时间: 2024-08-28 22:38:44

Linux下获取可执行程序的绝对路径的相关文章

Windows和Linux下获取当前可执行文件路径和工作目录

1.Windows下的获取当前可执行文件的路径和当前工程目录. (1)获取当前可执行文件路径: #include <shlwapi.h> #pragma comment(lib, "shlwapi.lib") wchar_t szExePath[MAX_PATH] = {0}; GetModuleFileNameW(NULL, szExePath, sizeof(szExePath)); PathRemoveFileSpecW(szExePath); (2)如果想获取当前工

Linux下获取arm的交叉编译工具链

转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gneabihf-gcc等. 前言 这里有一个专门的说法: “arm-linux-gnueabihf-gcc是由 Linaro 公司基于GCC推出的的ARM交叉编译工具.可用于交叉编译ARM系统中所有环节的代码,包括裸机程序.u-boot.Linux kernel.filesystem和App应用程序.使

在Windows及Linux下获取毫秒级运行时间的方法

在Windows下获取毫秒级运行时间的方法 头文件:<Windows.h> 函数原型: /*获取时钟频率,保存在结构LARGE_INTEGER中***/ WINBASEAPI BOOL WINAPI QueryPerformanceFrequency( _Out_ LARGE_INTEGER * lpFrequency ); /*获取从某个时间点开始的时钟周期数,保存在结构LARGE_INTEGER中**/ WINBASEAPI BOOL WINAPI QueryPerformanceFreq

如何在windows下和linux下获取文件(如exe文件)的详细信息和属性

程序员都很懒,你懂的! 最近在项目开发中,由cs开发的exe的程序,需要自动升级,该exe程序放在linux下,自动升级时检测不到该exe程序的版本号信息,但是我们客户端的exe程序需要获取服务器上新程序的版本号信息.最后由我用java实现linux上exe文件的版本号读取功能.下面是详细代码: package com.herman.utils; import java.io.File; import java.io.FileNotFoundException; import java.io.I

Linux下获取和设置IP

在Linux下获取关于IP和网关的操作:重点是对struct ifreq 的操作. 那么进入目录/usr/include/net/if.h下看查找struct ifreq结构体. /* Interface request structure used for socket ioctl's. All interface ioctl's must have parameter definitions which begin with ifr_name. The remainder may be in

linux下更改MySQL数据库存储路径

原文:http://www.cnit618.com/html/fwdkf/data/2111.htm linux下,MySQL默认的数据文档存储目录为/var/lib/mysql.假如要把MySQL目录移到/home/data下需要进行下面几步: 1.home目录下建立data目录 cd /home mkdir data 2.把MySQL服务进程停掉: mysqladmin -u root -p shutdown 3.把/var/lib/mysql整个目录移到/home/data mv /var

4.Linux下获取帮助

4.Linux下获取帮助 ·没必要记住所有东西,Linux提供了详细的帮助工具及文档, ·whatis,查看帮助的第一行, ·help:使用-h或者--help获取,如 ls --help或者help ls, ·man:(manual)Linux最常用的帮助命令,将要获取帮助的命令作为参数运行man命令,如man ls, ·man类型共分9种,如man 1 ls,man 5 ls, ·man -k 关键字,可以用来查询包含该关键字的文档,如man -k passwd, ·info:与man类似,

Linux下获取代码文件名、代码所在行数及日期时间的C程序实现

一.概述 在实际的软件开发项目中,为了方便排查程序问题,要求在日志文件中输出日志信息所在的程序文件名及日志代码所在的行数.此外,某些软件还会要求将程序启动时的日期时间输出到日志文件中,方便跟踪软件运行状况. 本文介绍了Linux下获取代码文件名.代码行数及日期时间的C代码实现. 二.几个标准预定义宏简介 在C语言中,使用几个标准预定义宏,便可轻松实现获取代码文件名.代码行数及日期时间的功能. 这几个宏的定义如下(注意:前后都是两条连续的下划线): __FILE__:在源文件中插入当前源文件名.

linux 下查看一个进程运行路径

在linux下查看进程大家都会想到用 ps -ef|grep XXX 可是看到的不是全路径,怎么看全路径呢? 每个进程启动之后在 /proc下面有一个于pid对应的路径 例如:ps -ef|grep python 显示:oracle    4431  4366  0 18:56 pts/2    00:00:00 python Server.py 4431就是进程号 到/proc/4431下,ls -l 会看到(需要root权限): 总用量 0 -r--r--r--    1 oracle