gcc编译后如何获取执行的文件名?

How to get the name of the executed file after compilation with gcc?

我正在用 C 编写一个程序,我希望它能够检测自己的名称。我会解释:

我希望它根据其名称执行特定操作。比方说:

    if (!strcmp(myName, "Program1"))
      printf("I am program 1!");
    else
      printf("I am someone else !");

此代码包含在 Program1.c 中,并使用 :

编译
gcc Program1.c -o Program1

我会用 :

来执行它
./Program1

但我找不到允许我获取值 "Program1"(可执行文件的名称)的代码,该值将是我提供的代码中的变量 myName。

有人可以帮我吗?

默认情况下,gcc 的输出名称不会存储在文件中的任何位置,而且我不知道有什么方法可以将它注入二进制文件。但这是你真正想要的吗?

程序的名称被调用为 可用为argv[0]。如果可执行文件在编译后已重命名,那可能会有所不同。

#include <stdio.h>
int main(int argc, char *argv[]) {
    printf("My name is %s\n", argv[0]);
    return 0;
}

调用程序选择了参数 0。它可以是包含目录信息的完整路径(它通常取决于调用者是执行 PATH 查找还是从显式位置调用可执行文件),因此如果您想基于此操作,您应该去除路径信息(例如使用 basename 在 Unix/POSIX 平台上)。

参数 0 由调用者选择,因此这是约定俗成的问题。但这是一个几乎普遍遵循的约定,除非调用者有充分的理由不遵守它。大多数平台都有找到可执行文件的方法。例如,在 Linux 上,/proc/self/exe 是可执行文件的符号 link。但在大多数情况下,如果调用者传递了不同的名称,这意味着调用者希望您的程序以该不同的名称运行,因此您应该使用 argv[0]

argv[0] 如果程序在没有参数的情况下调用(即如果 argc 为 0),则可以为 NULL。这种情况很少见,但为了稳健性,您的程序在这种情况下应该做一些明智的事情。