unix进程的环境--unix环境高级编程读书笔记
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环境高级编程读书笔记相关推荐
- 文件和目录(二)--unix环境高级编程读书笔记
在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...
- linux进程控制(一)--unix环境高级编程读书笔记
1.进程PID和特殊的3个进程 每一个进程在系统中都有一个唯一的标识,这个标识叫做进程标识符,或者叫 PID(process identity).我们可以通过调用 getpid 函数来获取一个进 ...
- 高级IO(一)--UNIX环境高级编程读书笔记
在前面学习了文件IO,标准IO和终端IO,现在学习高级IO,UNIX中怎么有这么多的IO. 1.非阻塞IO 可以将系统调用分为两类:低速系统调用和其他.低速系统调用是可能会使进程永远阻塞的一类系统调用 ...
- linux信号(二)--unix环境高级编程读书笔记
1.信号集 在linux中,可以用一个称为信号集的数据类型 sigset_t,来表示所有的被阻塞信号的一个集合.对这个集合的操作函数有: #include <signal.h>int s ...
- 文件io(一)--unix环境高级编程读书笔记
unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...
- linux信号(一)--unix环境高级编程读书笔记
1.信号的概念 在这里要给出一个信号的准确概念感觉很困难,可以这么说,信号就是进程之间或者内核与进程间异步通信的一种机制,有点类似于中断的性质.在 linux 系统中有 31 种信号,每一种信 ...
- APUE Unix环境高级编程读书笔记
.. 转载于:https://www.cnblogs.com/solitrarychen/p/5407536.html
- linux系统数据文件和信息--unix环境高级编程读书笔记
linux系统中的数据文件有很多,在这一章里介绍的主要内容是和系统有关的一系列文件,包括passwd,shadow,group,utmp,wtmp以及一些系统的相关信息和时间的相关操作. 1.pass ...
- 标准IO库--unix环境高级编程读书笔记
标准IO库是C语言提供的一个库,不光存在于linux中,在windows中也是有的.标准IO库和文件IO的不同是,标准IO库是对文件IO(即系统调用)的封装,并且在用户层添加了一些缓冲区. 文件IO的 ...
最新文章
- Leetcode: Maximum Depth of Binary Tree
- NAT的完全分析及其UDP穿透的完全解决方案
- C# delegate event
- 修改mysql导入sql大小限制_修改phpMyAdmin导入SQL文件的大小限制
- 云服务器定时启动程序_过去、现在和未来:开发一款微信小程序的技术迭代全过程...
- python3中round的用法_Python 3标准库用法--reversed、round、set
- python交通调查数据处理_python 小型交通调查后的数据处理(数车)
- mybatis-plus 中 queryWrapper and与or嵌套
- spark union 会引起shuffle吗_脑鸣不是耳鸣 会引起听力下降吗?
- matlab鲍威尔算法,鲍威尔法matlab程序
- vue3 路由跳转,打开新页面
- SOP标准作业——让企业持续改善工作
- 一文看懂π型滤波电路原理
- Ubuntu U盘权限只读的解决方案
- python 办公常用一:从文本文件中提取手机号码
- ProjectEuler Problem1.Multiples of 3 and 5
- opencv的透视变换(投影变换)
- 搭建即可运营的秒收录导航网源码带广告管理完美运营版
- 亲测有效解决“你已购买过此项目,现在可以免费下载,不再另外收费”提示
- 微软的服务器图片,微软公有云平台部署CNNIC服务器证书