现在的位置: 首页 > 综合 > 正文

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

2013年01月23日 ⁄ 综合 ⁄ 共 1355字 ⁄ 字号 评论关闭

/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;
}

 

抱歉!评论已关闭.