c语言 - POSIX:您如何确定自己进程的文件映像,以便执行自己?



如何确定表示当前进程可执行文件的文件?

问题是argv[0]是不可靠的,就好像它是通过execXp调用的,满足非限定命令的路径条目可能会也可能不会在前面。此外,exec*的任何调用方都可以用任何内容替换argv[0]

因此,如果您运行 ps ,则不能保证argv[0]将被"/usr/bin/ps"。事实上,你可能被保证相反。

我需要以下其中一项:

  1. 完整的路径名(无需自己进行路径搜索,以免我使用的 envp 不是 shell 使用的路径)
  2. 当前进程映像对应的文件的实时预打开文件描述符
  3. 一些与当前内存中的代码段相对应的魔术描述符(虽然不太确定 BSS 段)

这样,在启动时,我可以快速打开自己的可执行文件的 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()的血统)

所以基本上,最简单的平台是MacOS(因为libc是完全破碎的,如果forkexec之间调用getaddrinfo段错误,那么简单的东西会让你在盘子上。使用 main (http://web.archive.org/web/20170816030258/http://unixjunkie.blogspot.com/2006/02/char-apple-argument-vector.html) 的第四个参数或完全相同的 _NSGetExecutablePath 检索它 - 它只是一个知道内核放置文件名的相同特殊位置的函数。

对于所有平台,这是个案问题。此线程中的完整详细信息:查找当前可执行文件的路径,不带/proc/self/exe

相关内容

最新更新