Linux 进程环境

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值