args [0]是否保证是执行的路径?

时间:2008-12-21 01:21:44

标签: c++

这是一个基本问题,但也是一个重要问题......

启动主要方法具有以下共同签名的C ++程序时:

int main(int argc, char* args[]) {
    //Magic!
    return 0;
}

是否始终保证args [0]成为当前正在运行的程序的路径?那么跨平台呢(因为我在Linux环境中,但稍后可能会移植。)?

4 个答案:

答案 0 :(得分:21)

并非总是如此。这是您通过操作系统为程序提供的值。例如,使用exec启动程序时,您可以将其设置为任意值:

int execve(const char *filename, char *const argv[],
           char *const envp[]);

第一个参数是要启动的文件,argv将包含argv [0]以及main的所有其他参数。 envp包含环境变量(未由标准C或C ++定义。这是posix事物)。

更准确地说,这是C ++中argv的定义:

  

实现不应预定义主函数。此功能不应过载。它应该   返回类型为int类型,但其类型是实现定义的。所有实施   应允许以下两个主要定义:

int main() { /* ... */ }
  

int main(int argc, char* argv[]) { /* ... */ }
  

在后一种形式中,argc应该是从环境传递给程序的参数数量   该程序运行。如果argc非零,则这些参数应在argv[0]中提供   argv[argc-1]作为指向以null结尾的多字节字符串(NTMBS)的初始字符的指针   (17.3.2.1.3.2)和argv[0]应该是表示NTMBS的初始字符的指针,代表   用于调用程序的名称或“”。 argc的值应为非负值。的价值   argv[argc]应为0. [注意:建议在之后添加任何其他(可选)参数   argv的。 ]

这几乎取决于定义“用于调用程序的名称”的实现。如果要获取可执行文件的完整路径,可以在Windows上使用GetModuleFileName,并使用argv[0](用于获取用于执行的名称,可能是相对的)以及getcwd(获取当前工作目录,尝试将名称设为绝对名称。

答案 1 :(得分:5)

没有。在Windows上,GetModuleFileName保证了当前执行程序的确切完整路径。在linux上有一个符号链接/ proc / self / exe。在此符号链接上执行readlink以获取当前正在执行的程序的完整路径。即使youprogram被称为thorugh,symlink / proc / self / exe将始终指向实际程序。

答案 2 :(得分:3)

学生过去常常试图通过编写可以用“cc”或“tcsh”的argv [0]启动它的C程序来隐藏他们在学校大型机上玩Rogue的事实。

答案 3 :(得分:2)

以下是C标准所说的argv[0]应该是:

  

如果argc的值大于。{   零,指向的字符串   argv[0]代表程序名称;   argv[0][0]应为空   如果程序名称不是,则为字符   可从主机环境获得。

至于它是否包含完整路径,答案是argv [0]不一定包含可执行文件的完整路径。在Windows上,它似乎正是命令行上提供的内容。 Dunno Linux / Unix的功能。