main函数调用
命令行传参给程序
典型的存储空间布局
分配另外的存储空间
进程使用环境变量
进程的不同终止方式
longjmp和setjmp
main函数
内核执行C程序过程:
- 调用main前先调用特殊的启动例程
- 将此例程指定为程序起始地址
- 2由连接编辑器设置
- 3由C编译器调用
- 启动例程从内核获取命令行参数和环境变量
- 调用main
进程终止
5种正常终止
- main返回--return(0)
- exit
- _exit 或者 _Exit
- 最后一个线程从启动例程返回
- 最后一个线程调用pthread_exit
3种异常终止
- abort
- 接到一个信号
- 最后一个线程对取消请求做出响应
启动例程 exit(main(argc,argc))
退出函数
#include <stdlib.h>
void eixt(int status);//ISO C 历史原因会调用fclose 先执行清理,再返回内核
void _Exit(int status);//ISO C 立刻进入内核
#include <unistd.h>
void _exit(int status);//POSIX.1 立刻进入内核
return(0) 等于 exit(0)
ps: exit函数再退出进程的时候,回会反向调用atexit注册的函数,_Exit,_exit两个都没有这个操作,直接进入内核
Before termination, exit() performs the following functions in the order listed:
- Call the functions registered with the atexit(3) function, in the reverse order of their registration.
- Flush all open output streams.
- Close all open streams.
- Unlink all files created with the tmpfile(3) function.
#include <stdlib.h>
int atexit(void (*func)(void));
改写
typedef void Exitfunc(void);
int atexit(Exitfunc *func);
参数是函数地址
atexit用来登记最多32个函数,这些函数等级后将会称为终止吃了程序,会被exit自动调用
环境表
getenv 和 putenv
C程序的存储空间布局
- 正文段--低地址
- 初始化数据段
- 未初始化数据段 bss
- 堆
- 栈--高地址
栈之上存放环境表(指针数组),和环境字符串
共享库
动态库
静态库
存储空间分配
#include <stdlib.h>
void *malloc(size_t size);//指定字节数
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr,size_t newsize);//增减分配区长度
void free(void *ptr);
替代:
libmalloc
vmalloc
Quick-fit
jemalloc
TCMalloc
alloca
环境变量
#include <stdlib.h>
char *getenv(const char *name);
int putenv(const char *name,const char *value,int rewrite);
int unsetenv(const char *name);
environ->环境表->环境字符串
setjmp和longjmp
#include <setjmp.h>
int setjmp(jmp_buf env);//env 通常位全局变量 直接调用返回0,从longjmp返回为非0
void longjmp(jmp_buf env,int val);
setjmp记录函数的上下文,以此来供longjmp恢复
main中setjmp返回0,在后续执行中longjmp返回则返回非0
getrlimit setrlimit
#include <sys/resource.h>
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource,const struct rlimit *rlptr);
struct rlimit{
//hard limit >= soft limit
rlim_t rlim_cur;//soft limit
rlim_t rlim_max;//hard limit
}
strip 命令去除用于调试的文件的符号表信息