博客地址:http://www.cnblogs.com/zengjianrong/p/3222081.html

7.1 引言

Main函数调用;命令行参数;存储器布局;如何分配存储器;进程使用env;进程终止方式;longjmp、setjmp;进程资源限制。

7.2 main函数

内核执行c程序(exec函数)→调用启动例程(exit(main))→被可执行程序文件指定为程序的起始地址→调用main

C编辑器(cc)→调用连接编辑器→设置启动例程为程序的起始地址

7.3 进程终止(8种)

  1. Normal termination

(1)       从main返回;

(2)       调用exit;

(3)       调用_exit或_Exit;

(4)       最后一个线程从其启动例程返回(11.5);

(5)       最后一个线程调用pthread_exit(11.5))

  1. abnormal termination

(1)       调用abort(10.17);

(2)       接到信号并终止(10.2);

(3)       最后一个线程对取消请求做出响应(11.5、12.7))

  1. exit函数

(1)       stdlib.h:void exit(int status);void _Exit(int status);

(2)       unistd.h:void _exit(int status);

  1. exit(0)==returned(0),尽量使用returned(0)。
  2. exit handler:int atexit(void (*func)(void));调用顺序与登记顺序相反。

7.4 命令行参数

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

7.5          env list

extern char **environ;getenv();putenv()。

7.6          c程序存储空间布局

从上倒下,地址由高到低。可通过size命令查看。

高地址:命令行参数、环境变量(从0xC0000000开始往上存)

栈:自动变量、函数调用所需信息(从0xC0000000开始往下存)

很大的虚地址空间…..

堆:动态存储分配

bss(block started by symbol)未初始化数据段(由exec初始化为0或空指针)

Data初始化数据段(由exec从程序文件中读入)

低地址:text正文段(由exec从程序文件中读入),可共享、常常是read-only(从0x08048000开始往上存)

7.7          共享库

gcc、ld命令,加-static:阻止动态链接到共享库

7.8          存储器分配

  1. stdlib.h

(1)       void *malloc(size_t size);初始值不确定;

(2)       void *calloc(size_t nobj, size_t size);初始化为0;

(3)       void *realloc(void *ptr, size_t newsize);

(4)       void free(void *ptr);释放的空间一般保持在malloc池,不返回给内核

  1. 分配的空间=请求的空间+额外的空间(记录管理信息)
  2. 注意:不可越界读写,忘记free,造成泄漏(有些系统有附加检错)
  3. 对比malloc、alloca

(1)       malloc:在堆中分配空间

(2)       alloca:在当前函数栈帧上分配空间(good:函数返回时自动释放;bad:某些系统函数调用后栈帧不能增加,支持不了alloca)

7.9          环境变量

1.    stdlib.h

(1)char *getenv(const char *name);

(2)int putenv(char *str);

(3)int setenv(const char *name, const char *value, int rewrite);

(4)int unsetenv(const char *name);

2.    注意:只能影响到当前进程及其调用的子进程的环境变量

3.    对比:putenv(用栈存储,易出错);setenv(需分配存储区)

4.    修改env变量

7.10    setjmp、longjmp

深层嵌套的出错处理

未完,待续。。。。。。。。。。

unix高级环境编程学习笔记第七章(未完)的更多相关文章

  1. UNIX高级环境编程学习

    1-5实例 控制字符:ctrl + 另一个键.control + D或者^D是默认的文件结束符(EOF字符).

  2. UNIX高级环境编程1

    UNIX高级环境编程1 故宫角楼是很多摄影爱好者常去的地方,夕阳余辉下的故宫角楼平静而安详. 首先,了解一下进程的基本概念,进程在内存中布局和内容. 此外,还需要知道运行时是如何为动态数据结构(如链表 ...

  3. JVM学习笔记-第七章-虚拟机类加载机制

    JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...

  4. UNIX高级环境编程(14)文件IO - O_DIRECT和O_SYNC详解 < 海棠花溪 >

    春天来了,除了工作学习,大家也要注意锻炼身体,多出去运动运动.  上周末在元大都遗址公园海棠花溪拍的海棠花.   进入正题. O_DIRECT和O_SYNC是系统调用open的flag参数.通过指定o ...

  5. [Python学习笔记][第七章Python文件操作]

    2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...

  6. Unix高级环境编程

    [07] Unix进程环境==================================1. 进程终止    atexit()函数注册终止处理程序.    exit()或return语句:    ...

  7. JavaScript高级编程学习笔记(第三章之一)

    继续记笔记,JavaScript越来越有意思了. 继续... 第三章:JavaScript基础 ECMAScript语法在很大程度上借鉴了C和其它类似于C的语言,比如Java和Perl. 大小写敏感: ...

  8. o'Reill的SVG精髓(第二版)学习笔记——第七章

    第七章:路径 所有描述轮廓的数据都放在<path>元素的d属性中(d是data的缩写).路径数据包括单个字符的命令,比如M表示moveto,L表示lineto.接着是该命令的坐标信息. 7 ...

  9. UNIX环境编程学习笔记(26)——多线程编程(一):创建和终止线程

    lienhua342014-11-08 在进程控制三部曲中我们学习了进程的创建.终止以及获取终止状态等的进程控制原语.线程的控制与进程的控制有相似之处,在表 1中我们列出了进程和线程相对应的控制原语. ...

随机推荐

  1. Response.Write的alert换行问题

    Response.Write("<script> alert('恭喜 clientuser1注册成功!!!\\r\\n正在跳转到登录界面......');window.locat ...

  2. Java生鲜电商平台-提现模块的设计与架构

    Java生鲜电商平台-提现模块的设计与架构 补充说明:生鲜电商平台-提现模块的设计与架构,提现功能指的卖家把在平台挣的钱提现到自己的支付宝或者银行卡的一个过程. 功能相对而言不算复杂,有以下几个功能需 ...

  3. Python【day 12】生成器和推导式

    一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...

  4. windows下编写dll

    dll的优点 简单的说,dll有以下几个优点: 1) 节省内存.同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中.如果 ...

  5. python学习3-python views.py的返回值

    2.首先要说明一点是,对于HttpRequest对象来说,是Django自己创建的,但是HttpResponse就必须要我们自己创建.注意每个view方法都必须返回一个HttpResponse对象,H ...

  6. SparkStreaming实战(数据库(NoSQL))

    完全搞清楚项目需求,思考项目选项,这块就是使用的是数据库,就是HBase,因为它里面有一个非常合适的API,直接调用,即可 功能一: 今天到现在为止 实战课程 的访问量 yyyyMMdd 使用数据库来 ...

  7. 多线程学习笔记(三) BackgroundWorker 暂停/继续

    BackgroundWorker bw; private ManualResetEvent manualReset = new ManualResetEvent(true); private void ...

  8. 初识.netCore以及如何vs2019创建项目和发布

    一:什么是.netCore 从图上得知,.NetCore是同.NetFramework一样也是一种框架,并且都是基于.Net Standard Library,前面我们有用过.netFramwork来 ...

  9. 感知哈希算法——Python实现【转】

    转自:https://blog.csdn.net/m_buddy/article/details/78887248 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...

  10. BERT安装与使用

    环境: python 3.5 tensorflow 1.12.1 bert-serving-server 1.9.1 bert-serving-cline 1.9.1 官网上说要保证Python &g ...