Linux可执行文件的启动及命令行参数和环境变量的传递

问题的由来

我们知道,普通的C程序可以从命令行上接收参数,也可以使用、设置SEHLL环境变量(getenv,setenv),

/*一个简单的C例子 test.c*/

#include "stdio.h"

extern char** environ;   /*C库定义的全局变量,环境变量字符串数组的起始地址*/

int main(int argc, char* argv[])

{

    int i;

    char** p = environ;

    for(i=0; i<argc; i++)

        printf("argv[%d]: %s\n", i, argv[i]);

    printf("\n\nEnviroment Varibles\n\n");

    while(*p != NULL)

        printf("%s\n", *(p++));

    return 0;

}
编译后在命令行上运行 :

./test arg1 arg2.

可以将运行结果与env输出结果比较

执行普通的C程序时,因为有SHELL的存在,命令行参数和环境变量可以由SHELL传给C程序,这一点似乎容易理解。然而,对于Linux系统启动时运行的第一个用户程序init来说情况变得有些特别。init不是由用户在命令行上启动的(这时候根被还没有SHELL),而是由内核启动的,init程序里也使用了命令行参数和环境变量。

/*Busybox-1.19.3/init/init.c*/

int init_main(int argc UNUSED_PARAM, char **argv)
{

    if (argv[1] && strcmp(argv[1], "-q") == 0) {

       return kill(1, SIGHUP);

    }

    //……

   console_init();

   //……

}

static void console_init(void)

{
    //.......
    s = getenv("CONSOLE");
    s = getenv("TERM");
   //......
 }

从上面的代码片段里可以看到init程序和普通应用程序一样,也使用到了命令行参数和环境变量,既然这个时候还没有SHELL,那么init使用的命令行参数和环境变量保存在何处、从何而来?

保存在何处

Linux采用了虚拟内存技术,进程里使用的均是虚拟地址,内核通过为进程建立不同的页表,可以将两个相互独立的进程的相同的虚拟地址映射到不同的物理地址上,因此,Linux下所有可执行文件运行时在地址空间里的映像布局结构是一样的,这简化了系统设计。

下图是C

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux中,可以通过设置环境变量启动可执行程序。首先,在命令行中使用export命令设置环境变量。例如,如果要设置一个名为MY_VAR的环境变量,可以使用以下命令: export MY_VAR=value 其中,value是你想要设置的具体值。接下来,你可以通过直接输入可执行程序的名称来启动它。Linux会自动将环境变量传递给该程序。在程序中,你可以使用getenv函数来获取环境变量的值。例如,在C语言中,你可以使用以下代码来获取MY_VAR环境变量的值: #include <stdio.h> #include <stdlib.h> int main() { char* value = getenv("MY_VAR"); printf("MY_VAR的值是:%s\n", value); return 0; } 通过设置环境变量并在可执行程序中获取它,你可以在运行程序时动态地传递参数和配置信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *4* [【Linux环境变量](https://blog.csdn.net/weixin_74078718/article/details/129332049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Linux系统编程·环境变量](https://blog.csdn.net/weixin_57544072/article/details/127590605)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值