代码之家  ›  专栏  ›  技术社区  ›  jamesmillerio

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

c++
  •  8
  • jamesmillerio  · 技术社区  · 17 年前

    这是一个基本的问题,但仍然是一个重要的问题。。。

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

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

    4 回复  |  直到 17 年前
        1
  •  25
  •   Johannes Schaub - litb    17 年前

    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不为零,这些参数应以 argv[0] 通过 argv[argc-1] 作为指向以null结尾的多字节字符串(NTMBS)的初始字符的指针 argv[0] 应为指向NTMBS初始字符的指针,表示 argv[argc] 应为0。[注:建议在之后添加任何其他(可选)参数 argv.]

    这基本上取决于定义“用于调用程序的名称”的实现。如果要获取可执行文件的完整路径,可以使用 GetModuleFileName argv[0] getcwd

        2
  •  6
  •   Tim Matthews    17 年前

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

        3
  •  4
  •   chaos    17 年前

    学生们过去常常试图通过编写以argv[0]的“cc”或“tcsh”开头的C程序来掩盖他们在学校主机上玩流氓游戏的事实,这是无法保证的。

        4
  •  2
  •   Michael Burr    17 年前

    这里是C标准的说法 argv[0] 应该是:

    argc 大于 零,指向的字符串 argv[0] argv[0][0] 应为空 可从主机环境获得。