【发布时间】:2015-05-11 06:37:54
【问题描述】:
在我的 C++ 应用程序中,我的应用程序在 fork()ed 子进程中执行 execv() 以使用相同的可执行文件来处理具有不同参数的新子进程中的某些工作,这些参数与父进程的管道通信。为了获得 self 的路径名,我在 Linux 端口上执行以下代码(我在 Macintosh 上有不同的代码):
const size_t bufSize = PATH_MAX + 1;
char dirNameBuffer[bufSize];
// Read the symbolic link '/proc/self/exe'.
const char *linkName = "/proc/self/exe";
const int ret = int(readlink(linkName, dirNameBuffer, bufSize - 1));
但是,如果在可执行文件运行时,我将可执行文件替换为磁盘上二进制文件的更新版本,readlink() 字符串结果为:"/usr/local/bin/myExecutable (deleted)"
我知道我的可执行文件已被更新的更新版本替换,/proc/self/exe 的原始版本现已替换,但是,当我转到 execv() 时,它现在失败了,errno 2 - No such file or directory. 由于到结果中额外的尾随 " (deleted)"。
我希望execv() 将旧的可执行文件用于自己,或者使用更新的可执行文件。我可以检测到以" (deleted)" 结尾的字符串并对其进行修改以省略它并解析为更新后的可执行文件,但这对我来说似乎很笨拙。
当原始可执行文件在执行期间被更新的可执行文件替换时,我如何execv() 当前的可执行文件(或者如果更容易的话,则替换它)与一组新的参数?
【问题讨论】:
-
为什么不总是使用
argv[0],传递给main? -
@JonathonReinhart 因为 argv[0] 并不总是提供可执行文件的路径名,可能只命名可执行文件。
-
有趣的问题。我几乎在想修剪 ` (deleted)` 将是这里最直接的解决方案。
-
你可以在分叉后放弃 execv 吗?你可以直接调用你想跳转到的任何函数,而不是重新执行相同的程序。
-
如果有人从以 (deleted) 结尾的路径名运行您的程序,则修剪 (deleted) 将不起作用。
标签: c++ linux exec fork self-reference