为何argv[0]输出为./a.out而非a.out?
argv[0] 为何会包含路径前缀?
argv[0] 的值并不是固定的程序文件名,它完全由你启动程序时输入的命令字符串决定:
- 当你在终端输入
./a.out执行程序时,shell 会把这个完整的命令(包括当前目录的./前缀)传递给程序的 argv[0] 参数,所以输出自然是./a.out。 - 如果你把编译后的
a.out移动到系统 PATH 包含的目录(比如/usr/local/bin),之后直接输入a.out执行,argv[0] 就会是纯文件名a.out。 - 甚至可以给程序创建软链接,比如执行
ln -s a.out myprog,然后运行./myprog,此时 argv[0] 的值会变成./myprog——这足以说明,argv[0] 本质是调用程序时使用的标识符,和程序本身的实际文件名没有强制绑定。
如果需要在程序中获取不带路径的纯程序名,可以使用标准库的 basename() 函数(需要包含头文件 <libgen.h>),示例代码如下:
#include <stdio.h> #include <libgen.h> int main(int argc, char *argv[]) { printf("纯程序名:%s\n", basename(argv[0])); return 0; }
不管你用 ./a.out、/home/xxx/a.out 还是软链接执行,这段代码都会输出 a.out。
内容的提问来源于stack exchange,提问作者KimJunseo
相关产品推荐
相关产品推荐

