• unix高级环境编程学习笔记第七章(未完)


      博客地址: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

    深层嵌套的出错处理

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

  • 相关阅读:
    Python随笔之字典Dict
    Python随笔之列表List
    Python基础整理,懒得分类了,大家对付看看吧
    shell批量推送公钥脚本
    Xcode 切换target 之后打包失败
    百度导航sdk错误日志
    前端项目中去掉替换双引号
    taro3.x项目中引用taro-ui以及taro-iconfont-cli
    taro
    JS中some() every() forEach() map() filter()的区别
  • 原文地址:https://www.cnblogs.com/zengjianrong/p/3222081.html
Copyright © 2020-2023  润新知