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

linux 获取当前进程的可执行文件所在的目录

2013-04-07 19:38 656 查看

/proc/self

/proc 文件系统的一个额外的项目使程序可以更方便地使用 /proc 文件系统找到关于自身的信息。/proc/self 是一个指向当前进程

对应的 /proc 进程目录的符号链接。/proc/self 的链接目标决定于正在监视它的进程:每个进程都看到自己的 /proc 目录项是链接的目标。

举例来说,代码 是一个通过读 /proc/self 链接对象来确定自身进程 ID 的程序

从 /proc/self 获得进程 ID
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
/* 返回/proc/self符号链接所确定的调用进程ID。 */

pid_t get_pid_from_proc_self ()
{
char target[32];
int pid;
/* 读符号链接的目标。*/
readlink (“/proc/self”, target, sizeof (target));
/* 目标是以这个进程 ID 命名的目录。*/
sscanf (target, “%d”, &pid);
return (pid_t) pid;
}

int main ()
{
printf (“/proc/self reports process id %d\n”,
(int) get_pid_from_proc_self ());
printf (“getpid() reports process id %d\n”, (int) getpid ());
return 0;
}
/proc/self/exe
get_self_executable_directory 用于获取当前进程的可执行文件所在的目录。这个目录可被用于寻找其它的模块;它们在运行时被安装
在同一目录下。这个函数通过读取 /proc 文件系统提供的符号链接 /proc/self/exe
char* get_self_executable_directory ()
{
int rval;
char link_target[1024];
char* last_slash;
size_t result_length;
char* result;

/* 读符号链接 /proc/self/exe 的目标。 */
rval = readlink ("/proc/self/exe", link_target, sizeof (link_target));
if (rval == -1)
/* readlink调用失败,所以中止。*/
abort ();
else
/* 目标地址以 NUL 中止。 */
link_target[rval] = '\0';
/* 我们想对执行性文件名做去尾操作以获得包含它的目录。找到最右边的斜线。 */
last_slash = strrchr (link_target, '/');
if (last_slash == NULL || last_slash == link_target)
/* 一些异常正在发生。 */
abort ();
/* 分配一个缓存来管理结果路径。*/
result_length = last_slash - link_target;
result = (char*) xmalloc (result_length + 1);
/* 复制结果。*/
strncpy (result, link_target, result_length);
result[result_length] = '\0';
return result;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: