您的位置:首页 > 运维架构 > Linux

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

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

cur_dir=$(cd "$(dirname "$0")"; pwd)

2、C语言版
方法一:用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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: