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

标签 c gcc fedora

我正在用 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 的输出名称不会存储在文件中的任何位置,并且我不知道如何将其注入(inject)到二进制文件中。但这是你真正想要的吗?

程序被调用的名称可以作为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 是可执行文件的符号链接(symbolic link)。但在大多数情况下,如果调用者传递不同的名称,则意味着调用者希望您的程序以该不同的名称运行,因此您应该使用 argv[0]

如果在没有参数的情况下调用程序(即如果 argc 为 0),

argv[0] 可以为 NULL。这种情况很少见,但为了鲁棒性,您的程序在这种情况下应该做一些明智的事情。

关于c - 如何获取gcc编译后执行的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40873745/

相关文章:

c++ - 为什么在GCC上调用std::package_task失败

c++ - 如何在 CentOS 6 x64 上构建 gcc 4.7.2

mysql - 在 Fedora 中安装 MySQL

linux - Perl CGI "End of script output before headers"

C:指向结构定义中结构的指针

mysql - C API 支持调用mysql存储过程

c - 通过 telnet 发送击键

c - 在 c 中动态分配我的二维数组

php - 如何使用 Vala 编程语言制作 PHP 模块?

git - Fedora 33 git pull 或 clone 不再工作和/或 ssh key 不再识别