一、终止方式
正常终止:1、从main返回2.调用exit 3.调用_exit或_Exit 4.最后一个线程从启动例程返回 5.最后一个线程调用pthread_exit
异常终止:1、调用abort 2.接到一个信号 3.最后一个线程对取消做出响应
其中main函数返回一个整型值与调用exit等价,都会执行一个标准I/O库得清理关闭操作,对所有打开的流调用fclose函数
二、系统退出时自动调用函数atexit
一个进程可以登记多至32个函数,这些函数在exit时调用
int atexit(void(*func)(void));
调用顺序与注册顺序相反,同一函数可以注册多次
三、环境变量
每个进程都接收到一张环境变量表,都存在全局变量 extern char** environ,用于存储进程得环境表内容
环境变量函数
char* getenv(const char* name);
int putenv(char* str) 说明:str为name=value得形式
char* setenv(const char* name, const char* value, int rewrite);rewrite为非0则重写,
char* unsetenv(const char* name);
四、c程序存储空间布局
正文段:cpu执行得机器命令部分。
初始化得数据:数据段,包含文件中显示得赋初值得变量。例如int max=30;
未初始化得数据:bss段,包含函数外未赋值得变量。例如int max;由内核同意赋值为0
五、存储空间分配函数 malloc calloc realloc函数跳转setjmp,longjmp
参照如下demo
static jmp_buf jmpbuffer;
static int globval;
int main(void)
{
int autoval;
register int regival;
volatile int volaval;
static int statval;
globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5;
if (setjmp(jmpbuffer) != 0) {
printf("after longjmp:\n");
printf("globval = %d, autoval = %d, regival = %d,"
" volaval = %d, statval = %d\n",
globval, autoval, regival, volaval, statval);
exit(0);
}
/*
* Change variables after setjmp, but before longjmp.
*/
globval = 95; autoval = 96; regival = 97; volaval = 98;
statval = 99;
f1(autoval, regival, volaval, statval); /* never returns */
exit(0);
}
static void f1(int i, int j, int k, int l)
{
printf("in f1():\n");
printf("globval = %d, autoval = %d, regival = %d,"
" volaval = %d, statval = %d\n", globval, i, j, k, l);
f2();
}
static void f2(void)
{
longjmp(jmpbuffer, 1);
}
说明:
setjmp,指定调转位置
longjmp ,开始跳转,第二个参数为setjmp得返回值
longjmp跳转后,静态变量和全局变量得值保持不变,自动变量和寄存器中得变量不确定,因此需要指定为volatite得属性