gpt4 book ai didi

c - 如何在 OpenBSD 上获取可执行文件路径?

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:19 27 4
gpt4 key购买 nike

我试过:

char *path = realpath(getenv("_"), NULL);
*(strrchr(path, '/')+1) = '\0';

这行得通,但是如果我的可执行文件被父进程调用,然后显示父进程的路径。

我在谷歌上搜索了很多,但找不到任何正常工作的解决方案。

/proc 不是选项。

最佳答案

经过一些试验,我认为我有一个可行的解决方案...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <limits.h>
#include <unistd.h>
#include <sys/sysctl.h>
#include <sys/stat.h>

const char *getExecutablePath(char *epath) {
int mib[4];
char **argv;
size_t len;
const char *comm;
int ok = 0;

mib[0] = CTL_KERN;
mib[1] = KERN_PROC_ARGS;
mib[2] = getpid();
mib[3] = KERN_PROC_ARGV;

if (sysctl(mib, 4, NULL, &len, NULL, 0) < 0)
abort();

if (!(argv = malloc(len)))
abort();

if (sysctl(mib, 4, argv, &len, NULL, 0) < 0)
abort();

comm = argv[0];

if (*comm == '/' || *comm == '.') {
if (realpath(comm, epath))
ok = 1;
} else {
char *sp;
char *xpath = strdup(getenv("PATH"));
char *path = strtok_r(xpath, ":", &sp);
struct stat st;

if (!xpath)
abort();

while (path) {
snprintf(epath, PATH_MAX, "%s/%s", path, comm);

if (!stat(epath, &st) && (st.st_mode & S_IXUSR)) {
ok = 1;
break;
}

path = strtok_r(NULL, ":", &sp);
}

free(xpath);
}

if (ok)
*strrchr(epath, '/') = '\0';

free(argv);
return ok ? epath : NULL;
}

int main(void) {
char path[PATH_MAX];

if (getExecutablePath(path))
puts(path);

return 0;
}

关于c - 如何在 OpenBSD 上获取可执行文件路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31494901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com