Linux 进程环境

来源:互联网 发布:可以拍电影的软件 编辑:程序博客网 时间:2024/06/08 14:29

 进程终止:
C程序的终止分为两种: 正常终止和异常终止.
正常终止分为:

1.main函数return,

2.exit

3._exit或 _Exit

4.最后一个线程返回

5.最后一个线程pthreade_exit


异常中指分为: abort, SIGNAL, 线程响应取消

#include <stdio.h>#include <stdlib.h>pthread_t pid = 1;void (*__func) (void);void func1(){    printf("func1\n");}void func2(){    printf("func2\n");}void func3(){    printf("func3\n");}int main(void){    atexit(func1);    atexit(func2);    atexit(func3);    return 0;}
函数由exit按登记相反的顺序自动调用
但是如果用_exit()退出程序,则它不关闭任何文件,不清除任何缓冲器、也不调用任何终止函数

一、正文段。可执行程序在存储空间的的副本,cpu执行的机器指令部分。

二、初始化的数据段。它包含明确地赋初值的变量。如: int a = 1; 此变量放于数据段。

三、未初始化的数据段。 内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明 ,long sum[1000];此变量存放在非初始化数据段中。

四、栈。每次函数调用时,其返回地址以及调用者的环境信息都存放在栈中。最近被调用的函数在栈上为其自动和临时变量分配存储空间。每次函数调用结束后,系统会自动收回内存。(见下面的程序1说明)

五、通常在堆中进行动态存储分配。每次函数被调用结束后,系统不会收回内存。如下图所示:


    int a=0; //a在全局已初始化数据区    char *p1; //p1在BSS区(未初始化全局变量)    main()    {        int b; //b为局部变量,在栈区        char s[]="abc"; //s为局部数组变量,在栈区        //"abc"为字符串常量,存储在已初始化数据区        char *p1,*p2; //p1,p2为局部变量,在栈区        char *p3="123456"; //p3在栈区,123456\0在已初始化数据区        static int c=0; //c为局部(静态)数据,在已初始化数据区        //静态局部变量会自动初始化(因为BSS区自动用0或NULL初始化)        p1=(char*)malloc(10); //分配得来的10个字节的区域在堆区        p2=(char*)malloc(20); //分配得来的20个字节的区域在堆区        free(p1);        free(p2);        p1=NULL; //显示地将p1置为NULL,避免以后错误地使用p1        p2=NULL;    } 

1、 经过初始化的全局变量和静态变量保存在数据段中。

2、 未经初始化的全局变量和静态变量保存在BSS段。

3、 函数内部声明的局部变量保存在堆栈段中。



0 0