如何确定代表当前进程'可执行文件的文件?
问题是argv[0]
不可靠,好像它是通过execXp
调用的,满足非限定命令的路径条目可能会或可能不会被预先添加。此外,exec*
的任何来电者都可以用任何内容替换argv[0]
。
因此,如果您运行ps
,则无法保证argv[0]
为"/usr/bin/ps"
。事实上,你可能保证了OPPOSITE。
我需要以下其中一项:
通过这种方式,在启动时我可以快速打开FD到我自己的可执行文件(对于案例1,如果文件被删除并变得不可打开),然后在更晚的日期调用:
int fexecve(int fd, char *const argv[], char *const envp[]);
自己到fork
/ exec
(通常在OS-X上需要解决fork()
之后全局和系统描述符状态的不可靠性)。换句话说(这个例子当然很愚蠢):
void magicallyReplicate(argc, argv)
{
if (!fork()) {
magicallyExecMyself(argc, argv);
}
}
甚至只是:
void startOver(argc, argv)
{
magicallyExecMyself(argc, argv);
}
当然,在我的示例中,我将使用不同的argv
,以便我可以以不同的模式运行。
(早期“否”反驳:你不能使用clone()
,因为它属于fork()
的血统。
答案 0 :(得分:2)
所以基本上,最简单的平台就是MacOS(因为在fork
和exec
之间调用时,libc完全坏了,像getaddrinfo segfault这样简单的东西) - 在Darwin上,内核给你带来了在盘子上启动过程时的完整二进制名称。使用main(http://unixjunkie.blogspot.co.uk/2006/02/char-apple-argument-vector.html)的第四个参数或与_NSGetExecutablePath完全相同的方式检索它 - 它只是一个知道内核放置文件名的相同特殊位置的函数。
对于所有平台,这是一个个案的问题。此主题中的完整详细信息:Finding current executable's path without /proc/self/exe