linux下获取程序当前目录绝对路径
2014-05-04 15:58
543 查看
在linux下运行的程序经常需要获取自己的绝对路径,程序可能需要引用外部的资源文件,比如在../skin/目录下的图片,这样普通程序是没有问题,但当程序在安装到/usr/bin/目录中,或者为程序建立连接以后就会出现问题,我们可以直接通过运行程序的链接来运行程序,这样../skin/目录就找不到了,因为当前目录并不是程序所在的目录,而且链接所在的目录,所以在它的上一级目录中根本找不到skin目录,所以就需要获取程序的绝对路径
1、Shell版
2、C语言版
方法一:用realpath函数。这种方法用于开机启动程序获取自身目录会出错,linux下的realpath()函数在Mandriva
2009中出现了buffer overflow的错误,这可能是它的一个BUG。
方法二:用getcwd函数。这种方法用于开机启动程序获取自身目录会出错,getcwd可以取得当前路径;而不是程序的绝对路径;
方法三:用readlink函数。这种方法最可靠,可用于开机启动程序获取自身目录。
原理:每个进程在/proc下都有一个以进程号命名的目录。在该目录下有exe文件,该文件是一个链接文件,它指向的路径就是该进程的全路径,用readlink()读exe文件返回该进程的全路径。如果不在意可能导致的安全隐患,可以使用procfs,然后readlink,把当前进程的pid对应的目录下面的file指向的位置读出来(注意需要先挂载procfs)。
函数readlink的作用是读取符号链接的原路径,将它存到buf中,返回添充到buf中的字节数。,原型如下:
linux系统中有个符号链接:/proc/self/exe它代表当前程序,所以可以用readlink读取它的源路径就可以获取当前程序的绝对路径,如下:
1、Shell版
#获取当前脚本所在绝对路径 cur_dir=$(cd "$(dirname "$0")"; pwd) |
方法一:用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); |
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); |
原理:每个进程在/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); |
#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); |
相关文章推荐
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- linux下获取程序当前目录绝对路径
- linux下获取程序所在目录绝对路径
- Linux中获取当前程序的绝对路径
- Python获取当前程序绝对路径和目录
- Linux下获取当前程序的绝对路径
- Linux下获取当前进程的执行文件的绝对路径和所在目录(通过/proc/self/exe链接)
- 按键(vb)启动指定目录的程序以及获取当前应用路径
- Windows和Linux下获取当前可执行文件路径和工作目录
- linux下C程序获取绝对路径各种方法分析
- php获取当前目录绝对路径
- 在Linux下获取当前运行程序可执行文件全路径(不使用real_path()函数)
- Linux 下 去掉终端显示的当前目录的绝对路径
- Linux:获取当前进程的执行文件的绝对路径
- 获取当前程序所在路径/目录
- jsp中获取当前服务器上所在目录的绝对路径