linux下获取程序当前目录绝对路径
在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); |
更多推荐
所有评论(0)