在我的C++应用程序中,我的应用程序在一个fork()
的子进程中执行execv()
来使用相同的可执行文件以不同参数处理一些工作,并通过管道与父进程通信。为了获取自身的路径名,在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(已删除)"
我知道我的可执行文件已被新版本替换,并且用于/proc/self/exe
的原始文件已经被替换,但是当我尝试使用execv()
时,由于结果中有额外的后缀"(已删除)"
,它会失败并显示errno
2 - No such file or directory.
我想让execv()
要么使用旧的自身可执行文件,要么使用更新的可执行文件。我可以检测到以"(已删除)"
结尾的字符串,并修改它以省略该部分并解析为更新的可执行文件,但我认为这种方法有些笨拙。
当正在执行的原始可执行文件被更新为新版本时,如何使用一组新参数执行当前可执行文件(或其替换品)的execv()
函数?
main
的argv[0]
? - Jonathon Reinhartmain()
时,getcwd
+argv[0]
应该就足够了。但我想也许有可能创建一个不会以这种方式执行你的shell。 - Jonathon Reinhart