Linux进程环境
Linux下C程序都是main开始的,main函数的原型是:
int main(int argc, char **argv)
其中argc是命令行参数的数目,argc是指向参数的各个指针所构成的数组。
进程终止
C程序中有3个函数用于正常终止一个进程,_exit和_Exit立即进入内核,exit则做一些清理工作后后进入内核,比如清理IO缓冲区数据,对于所有打开的流进行close操作。 这3个函数都带一个整型参数,成为终止状态。
#include <stdlib.h> void exit(int status); void _Exit(int status); #include <unistd.h> void _exit(int status);
atexit函数
atexit函数用来登记终止处理函数,按照ISO C的规定,一个进程最多可以登记32个函数,这些函数将由exit函数自动调用。进程终止时,exit首先调用各终止函数,然后关闭打开的流。
#include <stdio.h> int atexit(void (*func)(void));
使用atexit函数登记进程终止函数:
#include <stdio.h> void my_exit1(void) { printf("my_exit1\n"); } void my_exit2(void) { printf("my_exit2\n"); } int main(int argc, char **argv) { atexit(my_exit1); atexit(my_exit2); printf("hello world\n"); return 0; }
输出结果:
进程环境表
每个进程都有一个环境表,与参数表一样,环境表也是一个指针数组:
通常用getenv和putenv函数来访问特定的环境变量,而不是environ变量。但是,如果要查看整个环境,则必须使用environ指针。
C程序的存储空间
任何程序的内存空间都可分为4个基本部分,各个部分的首地址是固定的。
- 正文段 这是CPU执行的机器指令部分
- 数据段(初始化数据段/非初始化数据段)
- 堆 通常在堆中动态分配存储
- 栈 自动变量以及每次函数调用时所需保存的信息都存放在此段中
存储空间分配
C程序中有3个用于空间动态分配的函数:
- malloc:分配指定字节数的存储区,此存储区的初始值不确定。
- calloc:为指定数量指定长度的对象分配存储空间,该空间每一位都初始化为0。
- realloc:增加或减少以前分配区的长度,当增加长度时,如果该分配区后面有相邻的足够空间,则直接在后面的临近空间分配;否则将以前分配区的内容转移到另一额足够大的区域中。