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