Linux下获取当前进程的执行文件的绝对路径和所在目录(通过/proc/self/exe链接)
2014-04-19 19:03
941 查看
#include <stdio.h>
#include <string.h> //strrchr(), strncpy()
#include <stdlib.h> //realloc()
#include <unistd.h> //readlink()
#define MAXBUFSIZE 1024
//通过链接文件名获取被目标文件绝对路径
//为了防止buffer不够大,包装一下readlink()
char* getFilePathByLink(const char *filename)
{
int size = 100;
char *buffer = NULL;
while(1)
{
buffer = (char *) realloc(buffer, size);
//readlink()返回的路径名并没有以'\0'结尾
int nchars = readlink(filename, buffer, size - 1);
if (nchars < 0)
{
free(buffer);
return NULL;
}
if (nchars <= size - 1) {
buffer[nchars] = '\0'; //让路径名以'\0'结尾
return buffer;
}
size *= 2; //buffer空间不足,扩大为2倍
}
}
//通过链接文件名获取被目标文件所在目录
char* getFileDirByLink(const char *linkfile)
{
char* pathbuf = NULL;
pathbuf = getFilePathByLink(linkfile);
if (NULL == pathbuf) {
printf("getFilePathByLink() Failed!\n");
return(NULL);
}
char* last_slash = NULL;
//找到最后一个'/',last_slash保存其地址
last_slash = strrchr(pathbuf, '/');
//如果是空,则未找到'/'
if (last_slash == NULL) {
printf("can not find '/'!\n");
return(NULL);
}
int dir_len = 0;
char* dir = NULL;
dir_len = last_slash - pathbuf + 1; //包括末尾的'/'
dir = (char*) malloc(dir_len + 1);
strncpy(dir, pathbuf, dir_len);
dir[dir_len] = '\0';
return dir;
}
int main( int argc, char * argv[] )
{
char* myself_exec = NULL;
myself_exec = getFilePathByLink("/proc/self/exe");
if (NULL == myself_exec) {
printf("getFilePathByLink() Failed!\n");
} else {
printf("I'm the process, my executable file: %s\n", myself_exec);
}
char* myself_exec_dir = NULL;
myself_exec_dir = getFileDirByLink("/proc/self/exe");
printf("I'm the process, my executable file in: %s\n", myself_exec_dir);
free(myself_exec);
free(myself_exec_dir);
return(EXIT_SUCCESS);
}
#include <string.h> //strrchr(), strncpy()
#include <stdlib.h> //realloc()
#include <unistd.h> //readlink()
#define MAXBUFSIZE 1024
//通过链接文件名获取被目标文件绝对路径
//为了防止buffer不够大,包装一下readlink()
char* getFilePathByLink(const char *filename)
{
int size = 100;
char *buffer = NULL;
while(1)
{
buffer = (char *) realloc(buffer, size);
//readlink()返回的路径名并没有以'\0'结尾
int nchars = readlink(filename, buffer, size - 1);
if (nchars < 0)
{
free(buffer);
return NULL;
}
if (nchars <= size - 1) {
buffer[nchars] = '\0'; //让路径名以'\0'结尾
return buffer;
}
size *= 2; //buffer空间不足,扩大为2倍
}
}
//通过链接文件名获取被目标文件所在目录
char* getFileDirByLink(const char *linkfile)
{
char* pathbuf = NULL;
pathbuf = getFilePathByLink(linkfile);
if (NULL == pathbuf) {
printf("getFilePathByLink() Failed!\n");
return(NULL);
}
char* last_slash = NULL;
//找到最后一个'/',last_slash保存其地址
last_slash = strrchr(pathbuf, '/');
//如果是空,则未找到'/'
if (last_slash == NULL) {
printf("can not find '/'!\n");
return(NULL);
}
int dir_len = 0;
char* dir = NULL;
dir_len = last_slash - pathbuf + 1; //包括末尾的'/'
dir = (char*) malloc(dir_len + 1);
strncpy(dir, pathbuf, dir_len);
dir[dir_len] = '\0';
return dir;
}
int main( int argc, char * argv[] )
{
char* myself_exec = NULL;
myself_exec = getFilePathByLink("/proc/self/exe");
if (NULL == myself_exec) {
printf("getFilePathByLink() Failed!\n");
} else {
printf("I'm the process, my executable file: %s\n", myself_exec);
}
char* myself_exec_dir = NULL;
myself_exec_dir = getFileDirByLink("/proc/self/exe");
printf("I'm the process, my executable file in: %s\n", myself_exec_dir);
free(myself_exec);
free(myself_exec_dir);
return(EXIT_SUCCESS);
}
相关文章推荐
- Linux:获取当前进程的执行文件的绝对路径
- linux 获取当前进程的可执行文件所在的目录
- Linux:获取当前进程的执行文件的绝对路径
- 使用GetModuleFileName()获取当前.exe所在绝对路径,并且读取.ini配置文件
- linux 内核中得到 当前进程 对应的可执行文件的 绝对路径
- linux 获得当前进程 对应的可执行文件的 绝对路径
- linux 获得当前进程对应的可执行文件的绝对路径
- linux 内核中得到 当前进程 对应的可执行文件的 绝对路径
- node.js认识学习二:__dirname获取当前模块文件所在目录的完整绝对路径
- 获取.EXE可执行文件所在的目录路径
- Windows和Linux下获取当前可执行文件路径和工作目录
- Linux C 获取当前进程可执行文件路径
- 用MFC实现代码获取当前EXE 执行的绝对路径,用于扩展相对路径扩展,以及计算文件大小功能
- 获取.EXE可执行文件所在的目录路径
- 获取当前进程的可执行文件的绝对路径
- linux 内核中得到 当前进程 对应的可执行文件的 绝对路径(转)
- RUBY获取当前的执行文件的路径和目录
- linux下获取程序当前目录绝对路径
- PHP获取当前文件所在目录的父目录的路径(两种方法)
- 获取当前程序可执行文件的所在路径