为何带argc/argv参数的C程序不同执行方式结果不同?
问题原因解析
这核心是**argv[0]的定义和execl函数的参数规则**导致的差异:
1. 终端执行时的参数逻辑
当你在终端敲./test 1 2 3时,shell会自动把:
argv[0]设为你输入的程序调用名./test1、2、3依次作为argv[1]、argv[2]、argv[3]argc的值是4(参数总数,包含argv[0])
你的循环从i=0开始遍历所有argv元素,自然会输出./test 1 2 3。
2. execl调用的参数规则
execl的参数格式是:
execl(程序路径, argv0, argv1, ..., NULL)
第二个参数直接对应新程序的argv[0],后面的参数依次是argv[1]、argv[2]...直到NULL终止。
你写的execl("/usr/src/test", "1", "2", "3", NULL)相当于:
- 把
"1"设为新程序的argv[0] "2"是argv[1],"3"是argv[2]argc的值是3
所以你的循环输出的就是1 2 3,完全符合参数传递的规则。
要和终端执行结果一致的修正写法
如果想让execl调用后的输出和终端执行一样,需要把程序名(或者你希望显示的标识)作为execl的第二个参数,比如:
execl("/usr/src/test", "./test", "1", "2", "3", NULL);
或者用完整路径也可以:
execl("/usr/src/test", "/usr/src/test", "1", "2", "3", NULL);
这样新程序的argv[0]就是程序名,输出就会和终端执行一致了。
内容的提问来源于stack exchange,提问作者Mr Right
相关产品推荐
相关产品推荐

