Linux 进程环境

    xiaoxiao2023-09-19  1

     进程终止: 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、 函数内部声明的局部变量保存在堆栈段中。

    转载请注明原文地址: https://ju.6miu.com/read-1279044.html
    最新回复(0)