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);
GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐