进程的开始于终止


    ***main函数的运行原理:
    程序在编译链接时使用链接器,运行时使用加载器。
    main的两个参数:argc、argv。当我们程序正常的编译成功后执行时,需要我们传入需要执行一定的参数(例如:./a.out),参数传入后传给加载器,加载器在加载运行程序时会将参数传给程序的引导代码,引导代码在执行完毕之后再将参数传给main函数,然后执行main函数。
    

    ***进程终止函数:
    正常的终止:return exit _exit
    差异:return和exit效果相同,都会执行程序终止处理函数;
          _exit终止程序时不会执行atexit注册的进程终止处理函数。
    
    非正常终止:atexit(func())注册新进程终止处理函数
    用法:在函数返回时调用atexit内的函数,atexit注册多个进程终止处理函数,这些函数指针存放在栈内,新的指针会对之前的指针进行压栈操作,使得先注册的后执行,后注册的先执行。
    
    例程:
/*********************************************************************************
    #include
    #include
    
    void func1(void)
    {
        printf("1111\n");
    }
    
    void func2(void)
    {
        printf("2222\n");
    }
    
    
    int main
    {
        printf("hello  word\n");
        
        atexit(func1);
        atexit(func2);
        
        printf("word hi \n");
        return 0;
    }
    
    output:  hello  word
             word hi
             2222
             1111
*****************************************************************************/    

    
    
    ***进程运行的虚拟地址空间:
    操作系统的每个进程在独立地址空间中运行,每个进程的逻辑地址为4G(32位),使用的方法就是虚拟地址映射。
    进程隔离使得多个进程可以同时运行:每一个进程会从虚拟地址的0地址开始执行我们的程序,进行我们的进程。  

    
    ***进程的概念:
        是程序的一次运行过程,是一个动态的过程,不是静态实物。
        声明周期是程序开始运行到结束。
        
    进程控制块:PCB,内核中专门用来管理一个进程的数据结构。
    进程ID:进程的标识符(相当于文件描述符)
    进程ID的获取方法:getpid  getppid  geteuid  getgid getdgid
    注:某一个进程的进程ID在进程进行完毕后会被丢掉,再次执行这个进程时操作系统会从当前的进程ID开始为你重新分配一个进程ID。
    多进程的调度原理:操作系统同时运行多个进程,在宏观上由于进程时间非常的短,所以看起来是并行的,但是咋微观上是串行的,进程的执行是有前后的顺序。
    
    
        
        
    
    
    
    
    
    
    
    
 

你可能感兴趣的:(linux的应用层开发)