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

jam*_*rio 10 c++

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

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

int main(int argc, char* args[]) {
    //Magic!
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*itb 22

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

int execve(const char *filename, char *const argv[],
           char *const envp[]);
Run Code Online (Sandbox Code Playgroud)

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

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

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

int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char* argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

在后一种形式中,argc应该是从运行程序的环境传递给程序的参数数量.如果的argc是非零这些参数应被供应argv[0]通过 argv[argc-1]作为指针指向空终止多字节串的初始字符(NTMBSs)(17.3.2.1.3.2)和argv[0]应为指针NTMBS的初始字符表示所用的名称调用程序或"".argc的值应为非负值.值 argv[argc]应为0. [注意:建议在argv之后添加任何其他(可选)参数.]

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


Tim*_*ews 5

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


cha*_*aos 5

这是非常不确定的,以至于学生们过去常常试图通过编写以“cc”或“tcsh”的argv[0]开头的C程序来隐藏他们在学校主机上玩Rogue的事实。