命令行参数

命令行参数

命令行参数是控制命令执行的一种方式。
命令行参数类似于函数的参数,只是命令行参数是传送给命令的。命令执行时,内核已经将命令行参数放入命令的栈中,命令执行时则可以获取命令行参数,解析,执行。命令行参数使命令可以执行不同任务。

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");
    }



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值