linux下获取程序当前目录绝对路径

linux下运行的程序经常需要获取自己的绝对路径,程序可能需要引用外部的资源文件,比如在../skin/目录下的图片,这样普通程序是没有问题,但当程序在安装到/usr/bin/目录中,或者为程序建立连接以后就会出现问题,我们可以直接通过运行程序的链接来运行程序,这样../skin/目录就找不到了,因为当前目录并不是程序所在的目录,而且链接所在的目录,所以在它的上一级目录中根本找不到skin目录,所以就需要获取程序的绝对路径

1Shell

#获取当前脚本所在绝对路径
cur_dir=$(cd "$(dirname "$0")"; pwd)

2C语言版

方法一:realpath函数。这种方法用于开机启动程序获取自身目录会出错,linux下的realpath()函数在Mandriva 2009中出现了buffer overflow的错误,这可能是它的一个BUG

char current_absolute_path[MAX_SIZE];
//获取当前目录绝对路径
if (NULL == realpath("./", current_absolute_path))
{
    printf("***Error***\n");
    exit(-1);
}
strcat(current_absolute_path, "/");
printf("current absolute path:%s\n", current_absolute_path);

方法二:getcwd函数。这种方法用于开机启动程序获取自身目录会出错,getcwd可以取得当前路径;而不是程序的绝对路径;

char current_absolute_path[MAX_SIZE];
//获取当前目录绝对路径
if (NULL == getcwd(current_absolute_path, MAX_SIZE))
{
    printf("***Error***\n");
    exit(-1);
}
printf("current absolute path:%s\n", current_absolute_path);

方法三readlink函数。这种方法最可靠,可用于开机启动程序获取自身目录。

原理:每个进程在/proc下都有一个以进程号命名的目录。在该目录下有exe文件,该文件是一个链接文件,它指向的路径就是该进程的全路径,用readlink()exe文件返回该进程的全路径。如果不在意可能导致的安全隐患,可以使用procfs,然后readlink,把当前进程的pid对应的目录下面的file指向的位置读出来(注意需要先挂载procfs)。

#include <unistd.h>
#include <stdio.h>
pit_t mypid = getpid(); 
sprintf(strsrc, "/proc/%d/file", mypid); 
readlink(strsrc, strdest, LEN);//LEN最好是你的_POSIX_PATH_MAX

函数readlink的作用是读取符号链接的原路径,将它存到buf中,返回添充到buf中的字节数。,原型如下:

1

2

3

#include <unistd.h> 

ssize_t readlink(constchar*restrict path ,char*restrict buf , size_t bufsize);

linux系统中有个符号链接:/proc/self/exe它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径,如下:

#include <unistd.h>
#include <stdio.h>
char current_absolute_path[MAX_SIZE];
//获取当前程序绝对路径
int cnt = readlink("/proc/self/exe", current_absolute_path, MAX_SIZE);
if (cnt < 0 || cnt >= MAX_SIZE)
{
    printf("***Error***\n");
    exit(-1);
}
//获取当前目录绝对路径,即去掉程序名
int i;
for (i = cnt; i >=0; --i)
{
    if (current_absolute_path[i] == '/')
    {
        current_absolute_path[i+1] = '\0';
        break;
    }
}
printf("current absolute path:%s\n", current_absolute_path);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值