/proc/self
/proc 文件系统的一个额外的项目使程序可以更方便地使用 /proc 文件系统找到关于自身的信息。/proc/self 是一个指向当前进程
对应的 /proc 进程目录的符号链接。/proc/self 的链接目标决定于正在监视它的进程:每个进程都看到自己的 /proc 目录项是链接的目标。
举例来说,代码 是一个通过读 /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; }