命令行参数
命令行参数是控制命令执行的一种方式。
命令行参数类似于函数的参数,只是命令行参数是传送给命令的。命令执行时,内核已经将命令行参数放入命令的栈中,命令执行时则可以获取命令行参数,解析,执行。命令行参数使命令可以执行不同任务。
linux下的实现
int execve(const char *pathname,char *const argv[],char *const envp[]);
execve是linux下执行程序的系统调用,当execve执行成功,原命令的进程空间会释放,放入pathname命令的代码,数据,而argv(envp也一样)的内容则会放入新的进程空间的栈中。
argv是字符指针数组,如图所示。
命令的命令行参数,一般是shell传入的。shell分析输入字符串,解析除命令路径,命令行参数。
ls -l -a
该命令中ls为命令名,-l,-a则为命令行参数。shell会将其解析为
argv[0]-->“ls”
argv[1]-->“-l”
argv[2]-->“-a”
argv[3]-->0 (NULL)空指针
并调用execve,将argv作为参数传入,执行命令。
以下代码运行可看到execve将命令行参数放入的方式
#include <stdio.h>
#include <string.h>
int main(int argc,char *argv[],char *envp[])
{
printf("argv address %x\n",&argv);
printf("argv[0] address %x \n",&argv[0]);
printf("argv[0] - argv = %d \n",(unsigned int)&argv[0]-(unsigned int)&argv);
int i;
for(i=0;i<argc;i++)
{
printf("argv[%d] address = %x \n",i,argv[i]);
printf("argv[%d] str = %s \n",i,argv[i]);
printf("argv[%d] strlen = %d \n",i,strlen(argv[i]));
printf("argv[%d] next address = %x \n",i,argv[i]+strlen(argv[i])+1);
printf("\n");
}
printf("envp address \n",&envp);
for(i=0;envp[i]!=NULL;i++)
{
printf("envp[%d] address = %x \n",i,envp[i]);
printf("envp[%d] str = %s \n",i,envp[i]);
printf("envp[%d] strlen = %d \n",i,strlen(envp[i]));
printf("envp[%d] next address = %x \n",i,envp[i]+strlen(envp[i])+1);
printf("\n");
}
}