• unix进程环境




    Unix进程环境


    一 . C程序启动过程

    1. 内核调用->启动例程(从内核获取命令行参数和环境变量值,启动例程为C程序的起始地址)
    2. 从C程序main返回时,启动例程调用exit(main(argc, argv))
      ps: main函数没有声明为返回类型的整形函数,则该进程的终止状态是未定义的(可执行 echo $?打印终止状态);
      exit首先调用各终止处理程序,然后按需多次调用fclose,关闭所有打开流;

    二 . 参数表

    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        int n = 0;
    
        for (; n < argc; ++n)
        {
            printf("argv[%d]: %s
    ", n, argv[n]);
        }
    
        return 0;
    }
    
    

    ​ 执行结果:

    [xl@bogon Documents]$ ./test 21 231 41
    argv[0]: ./test
    argv[1]: 21
    argv[2]: 231
    argv[3]: 41
    

    三. 环境表

    每个程序都会收到一张环境表,环境表也是一个字符指针数组。
    
    extern char **environ;
    

    ​ 示例:

    #include <stdio.h>
    
    extern char** environ;
    
    int main(int argc, char *argv[])
    {
        int n = 0;
        int e = 0;
    
        for (; n < argc; ++n)
        {
            printf("argv[%d]: %s
    ", n, argv[n]);
        }
    
        while (environ[e] != '')
        {
            printf("environ[%d]: %s
    ", e, environ[e]);
            e++;
        }
    
        return 0;
    }
    

    ​ 执行结果:

    [xl@bogon Documents]$ ./test 21 231 41
    argv[0]: ./test
    argv[1]: 21
    argv[2]: 231
    argv[3]: 41
    environ[0]: XDG_SESSION_ID=96
    environ[1]: HOSTNAME=bogon
    environ[2]: SELINUX_ROLE_REQUESTED=
    environ[3]: TERM=xterm
    environ[4]: SHELL=/bin/bash
    environ[5]: HISTSIZE=1000
    environ[6]: SSH_CLIENT=192.168.219.1 56189 22
    environ[7]: SELINUX_USE_CURRENT_RANGE=
    environ[8]: SSH_TTY=/dev/pts/2
    environ[9]: USER=xl
    environ[10]: LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
    environ[11]: MAIL=/var/spool/mail/xl
    environ[12]: PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xl/.local/bin:/home/xl/bin
    environ[13]: PWD=/home/xl/Documents
    environ[14]: LANG=en_US.UTF-8
    environ[15]: SELINUX_LEVEL_REQUESTED=
    environ[16]: HISTCONTROL=ignoredups
    environ[17]: SHLVL=1
    environ[18]: HOME=/home/xl
    environ[19]: LOGNAME=xl
    environ[20]: XDG_DATA_DIRS=/home/xl/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
    environ[21]: SSH_CONNECTION=192.168.219.1 56189 192.168.219.129 22
    environ[22]: LESSOPEN=||/usr/bin/lesspipe.sh %s
    environ[23]: XDG_RUNTIME_DIR=/run/user/1000
    environ[24]: DISPLAY=localhost:10.0
    environ[25]: _=./test
    environ[26]: OLDPWD=/home/xl
    

    四. C程序的存储空间布局

    组成 解释
    自动变量和函数调用时所需的信息(每次调用函数的返回地址以及调用者的环境信息)
    动态存储分配
    未初始化数据 bss段,内核将此段中的数据初始化为0或者空指针
    初始化数据 包含程序中明确赋初值的变量
    正文 可共享,只读

    PS: 程序中还有符号表的段、调试信息的段、动态共享库链接表的段,但这些不装载到进程执行的程序映像中。

    五. 共享库

    ​ 可执行程序可引用的存储区维护动态库的一个副本,程序第一次执行或者第一次调用某个库函数的时候,用动态链接的方法将程序和共享库函数相连接。减少了可执行程序的大小,增加了运行时间的开销。

  • 相关阅读:
    SSM-网站后台管理系统制作(4)---Ajax前后端交互
    SSM-网站后台管理系统制作(3)---Google的reCaptcha验证码
    SSM-网站后台管理系统制作(2)---SSM基本工作原理
    SSM-网站后台管理系统制作(1)
    编译原理(龙书)-编译器制作
    Linux相关代码
    Python制作AI贪吃蛇
    S-DES算法实现(C++版本)
    照片收藏
    Python-制作抖音图片
  • 原文地址:https://www.cnblogs.com/xl-cnblog/p/14993944.html
Copyright © 2020-2023  润新知