本章关注单进程执行环境:启动&终止、參数传递和内存布局等。

进程启动终止


如图所看到的:

  1. 启动:内核通过exec函数执行程序,在main函数执行之前。会调用启动例程(start-up routine),取得命令行參数和环境变量。能够把启动例程理解为exit(main(argc,argv))。

  2. 终止:五种正常终止方式(从main方法返回/exit/_exit/最后一个线程返回/最后一个线程退出)。三种异常终止方式(abort/接收到信号/最后一个线程接收到取消请求)。

  3. exit与_exit关系:exit调用_exit方法通知内核退出程序,之前会进行清理工作,包含调用用户通过atexit函数注冊的回调方法和标准I/O的fclose函数。

命令行參数和环境变量

main函数原型为:

int main(int argc, char *argv[]);

当中argc为參数个数,argv为參数指针数组,能够通过下面方法訪问:

for (i = 0; i <argc; i++) /* echo all command-line args */
printf("argv[%d]: %s\n", i, argv[i]);

环境变量也被传递给程序,环境变量定义在全局指针数组中:

extern char **environ;

能够通过getenv/putenv/setenv/unsetenv等函数訪问环境变量

C程序内存布局


如图所看到的:
  1. text:程序正文段,一般是仅仅读机器指令。
  2. initialized data:显示初始化的全局变量
  3. bss:名称为历史原因(block startedby symbol)。C语言未初始化。由内核初始化为0或者null的全局变量。
  4. heap:堆,动态分配内存。一般向高地址增长。
  5. stack:栈。保存局部变量。函数參数、返回地址等,一般向低地址增长。

  6. 使用size命令能够输出text,data,bss段大小。

  7. 大部分系统都支持共享库,共享库在内存中仅仅须要存在一份,全部进程都能够引用它,其长处是能够减小可运行文件大小,而且共享库能独立升级,使用它的程序不用又一次link。

其它重要函数

  1. 内存分配:malloc/calloc(分配n个大小同样的连续空间)/realloc(又一次分配。用于增大或者减小已经分配的内存空间,可能须要移动指针地址)/free(释放空间,指针的值并不会变成NULL,仅仅是这段内存能够又一次通过malloc分配)。内存分配通过系统调用sbrk来实现。
  2. 栈定位跳转:在C程序中使用goto仅仅能在同一个函数内部跳转。

    setjmp/longjump用于在栈上定位和跳转,一般用于在多层嵌套函数中进行错误处理。

    注意事项:当使用longjmp跳转后,所到达栈的局部变量和寄存器变量的值是不确定的,它们可能回滚到setjmp之前的状态。由于编译器优化后,局部变量和寄存器变量可能位于CPU寄存器上。而位于内存上的静态变量和volatile变量则没有这个问题,它们都保持近期一次被改动的值。

  3. 系统资源限制:getrlimit/setrlimit用于获取设置进程的软硬资源限制。相应系统命令为ulimit

最新文章

  1. Ubuntu jdk安装
  2. JS桌面应用
  3. CSRF的攻击与防御(转)
  4. C++模板 静态成员 定义(实例化)
  5. Eclipse配色插件
  6. 【分支结构】Jcc 的一些助记
  7. Kilani and the Game-扩散形式的搜索
  8. SpringBoot_定制banner
  9. vue项目如何通过前端实现自动识别并配置服务器环境地址
  10. java集合类List
  11. Linux之GDB学习
  12. redis StackExchange 主备 实现 demo
  13. CentOS之正则表达式
  14. vi 命令集
  15. IE中的userData
  16. 【BZOJ】【2434】【NOI2011】阿狸的打字机
  17. Java基础(十五):Java 中的内部类
  18. HDU 4714 Treecycle(树形dp)
  19. PHP打印日期
  20. bzoj1297: [SCOI2009]迷路(矩阵乘法+拆点)

热门文章

  1. 开发一款APP需要多少钱
  2. Acunetix Web Vulnerability Scanner使用和生成报告的方法
  3. JavaScript 单例,Hash,抛异常
  4. 三维重建:GitHub百度Apollo 2.0
  5. 导出数据到Excel表格
  6. C# HttpWebRequest Post Get 请求数据
  7. Ubuntu搭建LAMP开发环境
  8. 写给新手的十一条 Docker 守则
  9. 网络编程-socketserver
  10. (C/C++学习)19.单目标遗传算法的C程序实现