linux程序命令行参数,linux程序的命令行参数

程序执行的时候需要命令行参数,linux中更是这样,随便在shell输入/bin/XX --help后列举出来的参数让你头晕眼花,可是这些参数是怎么进入程序的呢,我们知道程序执行的时候一般从main开始,而mian有两个参数,一个是 argc代表参数的个数,一个是argv代表具体字符串类型的参数,这是我们所看到的,我们都知道函数的参数都在堆栈中,在调用函数前,主调函数应该将参数压入堆栈后再调用被调函数,那么是谁调用的main函数呢?又是谁将main的参数压入堆栈的呢?

关于第一个问题,是谁调用的main函数,我就不多说了,因为网上已经有了一篇叫做《before main》的文章了,写得非常好,可以搜索一下,读了此文你会明白实际上用户进程的开始函数并不是main,在main之前还有很多工作要做,但是如果说 是XX调用了main,那么就是XX压入了参数,我们很多人喜欢纠着一个问题一直到底,那我们就较较真儿,又是谁将参数给了XX呢?我们开始一个程序的时 候要调用exec系列函数,比如execve,我们看看execve的声明:

int execve(const char *filename, char *const argv[],char *const envp[]);

我 们看一下这第二个和第三个参数实际上就是main的参数(main的第一个参数argc是由这些参数算出来的),而调用execve的时候还是原来的进 程,新的进程还只是一个filename,具体能否执行还有待商榷呢,新进程根本没有映射进用户空间,这时这些参数是怎么传递给新的进程的呢?我们于是就来正式解答第二个问题:又是谁将main的参数压入堆栈的呢?

研究linux有个好的不得了的资源就是内核,当你遇到任何棘手的问题都可以从内核得到解答,当然今天我们的问题并不算棘手!我们还是看看sys_ececve是怎么做的:

asmlinkage int sys_execve(struct pt_regs regs)

{

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值