zoukankan      html  css  js  c++  java
  • 【APUE】Chapter7 Process Environment

    这一章内容是Process的基础准备篇章。这一章的内容都是基于C Programm为例子。

    (一)进程开始:

      kernel → C start-up rountine → main function

      其中C start-up rountine做的事情中包括:获得command-line arguments & environment

      好像还有其他的事情,后面再说。

    (二)进程结束:

      五种normal termination方式:

        1. return from main

        2. exit

        3. _exit _Exit

        4. 从start routine调用的last pthread里面return

        5. 在最后一个pthread中调用pthread_exit

      三种abnormal termination方式:(这三种方式先不学)

        1. abort

        2. receipt of a signal

        3. response of the last pthread to a cancellation request

      注册进程退出时执行“钩子函数”:atexit

        基于stack结构实现的,所以用atexit注册的函数在进程exit的时候是reverse order执行的(跟Chapter11提到的进程清理函数也类似)

        这部分的代码比较直观,看书上P202 Figure7.3代码即可。

     APUE 英文3版201页Figure7.2是个比较综合的图,很好阐述了进程开始和结束的各种路径以及做的事情

        简单来说:

        1. return或exit :先调用各种exit handler以及standard I/O cleanup;再调用_exit或_Exit

        2. 如果是直接_exit或_Exit就直接强行退出进程,一步到位,不会调用各种exit handler和Cleanup等了

    (三)Command-Line Arguments

      没有什么特别解释的 就是main传入两个参数:

      1. int argc:参数个数

      2. char *argv[]:以字符串形式传入的参数

      argv[0]永远是命令本身,从argv[1]开始是真正传入程序的参数

    (四)Environment List

      之前main的参数中是有这个的;但是后来发现这东西的用途太多了,地位就升级了,就给他专门搞了一些内置的函数去操作

    (五)Memory Layout of a C program

      重点都在P206的Figure7.6上面。

      地址由高到低依次是:

      第一部分:Command-Line arguments & environment variables

      第二部分:stack(栈)(调用函数的stack frame在这里,函数返回之后,这部分资源就可能瞬间被其他内容覆盖了)

      第三部分:留白 (stack可以向下grow,占用这块留白;heap可以向上grow,占用这块留白)

      第四部分:heap(堆)(提供动态分配的空间:malloc;如果忘了free,就memory leak了)

      第五部分:uninitialized data (没有初始化的全局变量)

      第六部分:initialized data (初始化的全局变量)

      第七部分:text segment(包括CPU可执行的machine instructions)

      其中,只有六、七两部分是存在于program file中的;五貌似也像在program file中的,其实不是的,是由kernel设置为0的。

    (六)Shared Libraries、(七)Memory Allocation留以后用到再看

    (八)Environment Variables

      由于Environment Variables的地位提高了,因此有三个函数可以改环境变量:

        1. putenv

        2. setenv

        3. unsetenv

      这里有两点需要注意下:

        1. 就是这个简单的Environment Variables,为什么要搞这样几个复杂的函数去设置、修改?回想Memory Layout of a C program,最上面那块大小是定死的:如果EV比原来短还好,比原来长,或者动态增加,就需要利用heap空间了。这就涉及到一些麻烦事情。详情书上写的挺好。

        2. 进程中设定EV的作用域:在当前进程设置的EV,只对当前进程以及其子进程有效,不影响其他进程。

    (九)setjmp和longjmp

      代码都在书上,很直观就不粘上来了。

      Goto是在同一个函数中跳转(某个stack frame内);setjmp和longjmp负责在一个进程的函数间跳(夸若干个stack frame)

      有几点需要注意:

        1. setjmp设定跳回到哪,longjmp负责跳,用jmp_buf类型的变量来协调二者,跳到哪。

        2. 通一个setjmp可以从不同地方longjmp回来

        3. f1() { setjmp; f2(){f3(longjmp;)}} 如果从f3中跳回f1,则stack中f2和f3的stack frame都无效了(即不归f2和f3是换了,可能迅速被其他占用了)

        4. 还是3中的例子,如果longjmp回到f1中了,那么f1中变量的状态呢?受到执行完f1和f2之后的影响,还是保存之前的状态呢?答案是不一定,尤其是autmatic register变量,更是不一定了。这里比较好的办法是,把变量设成volatile的,这样即使longjmp回来,变量肯定是受到f2和f3的影响后的值,不会出现不确定状态

    (十)getrlimit & setrlimit

      涉及到进程占用资源的分配,后面再看。

      

      

  • 相关阅读:
    cookie+session,会话时间设定
    input中id和name属性的区别。
    框架和设计模式的区别
    Java数字格式化输出时前面补0
    DDL_数据库模式定义语言
    7.JAVA_SE复习(文件)
    (python)数据结构---集合
    (python)数据结构---字典
    (python)数据结构---字符串
    (python)排序算法
  • 原文地址:https://www.cnblogs.com/xbf9xbf/p/4805983.html
Copyright © 2011-2022 走看看