1.进程的启动

进程总是从   main   函数开始执行的,main函数的函数原型如下:

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

当内核启动  c   程序时,使用一个   exec   函数。这个   exec   函数就是调用   main   函数之前的一个启动例程。可执行程序文件,将此启动例程的地址设置为程序的起始地址,这个工作是由连接编辑程序(即编译器)设定的,这个连接编辑程序在   linux   中就是gcc啦。启动例程从内核获取命令行参数和环境变量,然后调用   main   函数。

2.进程的终止

进程的终止方式分为正常终止和异常终止两种方式,这两种方式的情况如下:

正常终止
1.从   main   函数返回
2.调用   exit   函数
3.调用   _exit   函数异常终止
1.调用   abort   函数
2.由一个信号终止

exit   函数和   _exit   函数用来终止一个程序,它们两个的区别是,调用   _exit   函数会立即进入到内核,而调用   exit   函数,会先进行一些处理善后工作(如刷新IO),然后调用   _exit   函数进入内核。我们可以使用   atexit   函数来注册一些终止处理程序,这些终止处理程序在调用   exit   函数时会自动执行,并且先注册的后执行,后注册的先执行。一个c程序的启动和终止的生命周期图如下:

c   语言的命令行参数,我只前曾经总结过,详情参考我的另一篇博客点击打开链接。

3.  c程序的存储空间布局

由于历史的原因,c程序的存储空间布局一直是如下的格式:

我们就从下到上一次介绍每一个部分。

正文部分也就是程序体,一般将它设置为只读的,所以程序的正文是可以被几个进程共享的。即使对于经常使用的程序,它的程序正文在内存中也只有一个拷贝。初始化数据段用来存储被赋予初值的全局变量。例如在所有函数之外声明的变量, int max = 100;就存放在这个区域。未初始化数据段用来存储未赋予初值的全局变量。例如,函数之外的声明,long sum[1000];就存储在这个区域中,在这个区域中的值被初始化为0。堆用来为程序在运行时动态的分配内存空间。栈用来存储函数中的一些局部变量以及在发生函数调用时,保存现场信息。最上面用来存放命令行参数和环境变量。

说到环境变量就需要提到进程的环境表。以前   main   函数的原型是下面这个样子的:

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

第三个参数是传递的环境表。但是,后来又添加了一个全局变量用来存储环境变量,这个变量就是   environ   ,它是一个存储环境表变量指针的数组,并且最后一个元素是NULL。后来发现   envp   参数并不比   environ   简便。所以,后来的c标准将第三个参数去掉了。但是对于环境变量的存取有几个函数可以使用:

       #include <stdlib.h>char *getenv(const char *name);
       #include <stdlib.h>int putenv(char *string)
       #include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);int unsetenv(const char *name);

4.存储器分配

存储器分配主要涉及到4个函数:

       #include <stdlib.h>void *malloc(size_t size);void free(void *ptr);void *calloc(size_t nmemb, size_t size);void *realloc(void *ptr, size_t size);

这里的函数分配的存储空间主要是在进程的堆上进行的。malloc   函数用来分配一定长度的字节,calloc   函数用来为某一对象分配一定个数的空间,realloc   用来重新调整已分配的动态内存的大小,free   函数用来释放已经分配的内存的空间。

5.setjmp和longjmp

setjmp和longjmp函数用来在各个函数之间来回跳转,相当与是函数之间的goto语句。但是在哥各个函数之间跳转时,需要注意变量是否回滚。一般来说,需要将变量声明为   volatile 为最好,这样就可以保证变量不会因为   longjmp   而发生回滚。volatile   为易失性变量,这样就保证了,变量一直存储在存储器中,从而变量就不会发生变化。

6.共享库

共享库就是把程序可能用到的头文件,放入到内存的一个共享存储区中,而不用放到每一个程序文件中。当程序执行时,再动态的链接共享存储区中的内容。这样就减少了程序正文的长度,但是也相应的加长了程序的执行时间。

unix进程的环境--unix环境高级编程读书笔记相关推荐

  1. 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  2. linux进程控制(一)--unix环境高级编程读书笔记

    1.进程PID和特殊的3个进程 每一个进程在系统中都有一个唯一的标识,这个标识叫做进程标识符,或者叫  PID(process identity).我们可以通过调用  getpid  函数来获取一个进 ...

  3. 高级IO(一)--UNIX环境高级编程读书笔记

    在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO. 1.非阻塞IO 可以将系统调用分为两类:低速系统调用和其他.低速系统调用是可能会使进程永远阻塞的一类系统调用 ...

  4. linux信号(二)--unix环境高级编程读书笔记

    1.信号集 在linux中,可以用一个称为信号集的数据类型  sigset_t,来表示所有的被阻塞信号的一个集合.对这个集合的操作函数有: #include <signal.h>int s ...

  5. 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  6. linux信号(一)--unix环境高级编程读书笔记

    1.信号的概念 在这里要给出一个信号的准确概念感觉很困难,可以这么说,信号就是进程之间或者内核与进程间异步通信的一种机制,有点类似于中断的性质.在  linux  系统中有  31  种信号,每一种信 ...

  7. APUE Unix环境高级编程读书笔记

    .. 转载于:https://www.cnblogs.com/solitrarychen/p/5407536.html

  8. linux系统数据文件和信息--unix环境高级编程读书笔记

    linux系统中的数据文件有很多,在这一章里介绍的主要内容是和系统有关的一系列文件,包括passwd,shadow,group,utmp,wtmp以及一些系统的相关信息和时间的相关操作. 1.pass ...

  9. 标准IO库--unix环境高级编程读书笔记

    标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...

最新文章

  1. Leetcode: Maximum Depth of Binary Tree
  2. NAT的完全分析及其UDP穿透的完全解决方案
  3. C# delegate event
  4. 修改mysql导入sql大小限制_修改phpMyAdmin导入SQL文件的大小限制
  5. 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
  6. python3中round的用法_Python 3标准库用法--reversed、round、set
  7. python交通调查数据处理_python 小型交通调查后的数据处理(数车)
  8. mybatis-plus 中 queryWrapper and与or嵌套
  9. spark union 会引起shuffle吗_脑鸣不是耳鸣 会引起听力下降吗?
  10. matlab鲍威尔算法,鲍威尔法matlab程序
  11. vue3 路由跳转,打开新页面
  12. SOP标准作业——让企业持续改善工作
  13. 一文看懂π型滤波电路原理
  14. Ubuntu U盘权限只读的解决方案
  15. python 办公常用一:从文本文件中提取手机号码
  16. ProjectEuler Problem1.Multiples of 3 and 5
  17. opencv的透视变换(投影变换)
  18. 搭建即可运营的秒收录导航网源码带广告管理完美运营版
  19. 亲测有效解决“你已购买过此项目,现在可以免费下载,不再另外收费”提示
  20. 微软的服务器图片,微软公有云平台部署CNNIC服务器证书

热门文章

  1. sql 存储过程分页
  2. [转载] Python dict.keys方法
  3. [转载] python字符串查找的四种方法
  4. Vue.js 学习笔记 十一 自定义指令
  5. angular 上传图像的使用总结
  6. android中shape的属性
  7. php对用户输入的非标准格式日期匹配
  8. 截获3389远程登陆的密码
  9. (十六)K-Means聚类
  10. python之matplotlib中plt.show()不显示