我希望在没有使用C++代码的root权限的情况下获得正在运行的进程(可执行文件)的完整路径.有人可以建议一种方法来实现这一目标.
在Linux平台上我可以通过以下方式来实现.
char exepath[1024] = {0};
char procid[1024] = {0};
char exelink[1024] = {0};
sprintf(procid, "%u", getpid());
strcpy(exelink, "/proc/");
strcat(exelink, procid);
strcat(exelink, "/exe");
readlink(exelink, exepath, sizeof(exepath));
Run Code Online (Sandbox Code Playgroud)
这里exepath为我们提供了可执行文件的完整路径.
同样对于Windows我们使用它
GetModuleFileName(NULL, exepath, sizeof(exepath)); /* get fullpath of the service */
Run Code Online (Sandbox Code Playgroud)
请帮助我在HP-UX上执行此操作,因为HP-UX中没有/ proc目录.
小智 9
首先,我想对你的Linux解决方案发表评论:它大约是它需要的5倍,执行大量完全不必要的操作,以及使用1024个幻数,这是完全错误的:
$ grep PATH_MAX /usr/include/linux/limits.h
#define PATH_MAX 4096 /* # chars in a path name */
Run Code Online (Sandbox Code Playgroud)
这是一个正确的最小替换:
#include <limits.h>
...
char exepath[PATH_MAX] = {0};
readlink("/proc/self/exe", exepath, sizeof(exepath));
Run Code Online (Sandbox Code Playgroud)
其次,在HP-UX上,您可以使用shl_get_r()获取有关所有已加载模块的信息.在索引0处,您将找到有关主可执行文件的信息.在desc.filename将指向可执行文件的名称的execve(2)时候.
遗憾的是,该名称是相对的,因此您可能必须进行搜索$PATH,如果应用程序执行此操作,putenv("PATH=some:new:path")或者如果原始exename是例如./a.out并且应用程序已执行,则可能会失败chdir(2).
| 归档时间: |
|
| 查看次数: |
6910 次 |
| 最近记录: |