第七章 进程环境

2018-10-07  本文已影响5人  laidian

main函数调用

命令行传参给程序

典型的存储空间布局

分配另外的存储空间

进程使用环境变量

进程的不同终止方式

longjmp和setjmp

main函数

内核执行C程序过程:

  1. 调用main前先调用特殊的启动例程
  2. 将此例程指定为程序起始地址
  3. 2由连接编辑器设置
  4. 3由C编译器调用
  5. 启动例程从内核获取命令行参数和环境变量
  6. 调用main

进程终止

5种正常终止

  1. main返回--return(0)
  2. exit
  3. _exit 或者 _Exit
  4. 最后一个线程从启动例程返回
  5. 最后一个线程调用pthread_exit

3种异常终止

  1. abort
  2. 接到一个信号
  3. 最后一个线程对取消请求做出响应

启动例程 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:

  1. Call the functions registered with the atexit(3) function, in the reverse order of their registration.
  2. Flush all open output streams.
  3. Close all open streams.
  4. 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程序的存储空间布局

  1. 正文段--低地址
  2. 初始化数据段
  3. 未初始化数据段 bss
  4. 栈--高地址

栈之上存放环境表(指针数组),和环境字符串

共享库

动态库

静态库

存储空间分配

#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 命令去除用于调试的文件的符号表信息

上一篇下一篇

猜你喜欢

热点阅读