版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linux环境高级编程,第4课流程,流程,流程环境(第7章)流程控制(第8章)流程关系(第9章),流程,流程环境(第7章)流程控制(第8章)流程关系(第9章),流程环境main函数和命令行参数进程的开始和结束环境表和环境变量存储空间布局内存分配setjmp和longgjmp函数、main函数和命令行参数,通常,c程序总是从main函数开始,然后是main函数原型int main(int argc,char * argv); 参数argc:命令行参数数argv:由命令行参数中的每个指针组成的阵列命令行$。/test Hello World,程序如何获取命令行参数,main函数和命令行参数,参数a
2、grv:argv1,argv0,argv2,.argv argc-1、argv、main函数和命令行参数、程序演示(4.1)、进程环境、main函数和命令行参数进程的开始和结束环境表以及环境变量存储空间布局存储分配setjmp和longjmp函数、进程的结束、void _ Exit(int status);void _ exit(int status);Exit函数对一个标准I/o库执行清理结束操作(对所有打开流调用fclose函数),然后_Exit、_exit函数直接进入内核,进程结束(4.2),Exit等函数的参数status:查看进程的结束状态程序演示进程结束状态、atexit函数,在进
3、程结束时,程序可能需要执行某些自行清理操作(如资源发行版)的atexit函数,使用户可以注册多个退出处理函数。退出处理函数在进程结束时自动调用,atexit函数用于注册用户提供的退出处理函数原型int atexit(void (*func)(void)。参数func:函数指针,返回值为void,无参数返回值为成功0,错误返回值为非零值,atexit函数,程序演示(4.3)注:首先注册的函数将在以后运行。_exit函数调用结束处理函数、进程的开始和结束、Kernel、exit func、自定义函数、main函数、c启动例程、结束处理函数、结束处理函数、标准I/O清理函数、和环境字符串:name=
4、value,环境表和环境变量,如何访问环境变量直接使用函数getenv函数(如getenv和putenv)使用环境变量值函数原型char * getenv(const char * name);返回指向与Name关联的value的指针,如果不存在,则返回NULL,以便返回的指针指向新分配的内存或环境表中的值(程序4.4)。设置环境变量的三种方法:putenv setenv unsetenv putenv函数将name=value形式的字符串置于环境表中。如果Name已存在,请先删除原始定义。函数原型:int putenv(char * str);设置环境变量,setenv函数原型:intset
5、env (const char * name,const char * value,int rewrite);将Setenv环境变量name的值设置为value。如果Name已经有rewrite!=0时,删除原始定义rewrite=0不会删除原始定义,而是设置环境变量,并且unsetnv函数会删除环境变量函数原型int unsetnv (constchar * name)。删除Name的定义问题吗?设置环境变量的前两个函数都提供了自己的缓冲区存储环境变量。环境表是直接使用这些缓冲区,还是在环境表本身分配缓冲区?(程序4.5)、流程环境、main函数和命令行参数流程的开始和结束环境表和环境变量存
6、储空间布局存储分配setjmp和longjmp函数、C程序存储空间布局、命令行参数和环境变量、堆栈堆、未初始化的数据、初始化的数据、主体、hii 只读High address,Low address,Low address,其中包括需要在程序中明确指定初始值的变量,如c程序存储空间布局、命令行参数和环境变量、堆栈堆、未初始化的数据、已初始化的数据、主体、全局变量int maxcount=99 、c程序存储空间布局、命令行参数和环境变量、堆栈堆、未初始化的数据、已初始化的数据、主体、High address、Low address,在运行程序之前将此部分的数据初始化为零(例如,long sum1
7、000),c程序存储空间布局,命令行参数和环境变量,堆栈堆,未初始化的数据,已初始化的数据,主体,High address,Low address,用于动态内存分配,c程序存储空间布局,命令行参数和环境变量,以及查看进程的地址空间(4.11) $cat /proc/进程ID/maps /proc目录中的文件不是物理磁盘文件,而是内核虚拟创建的文件系统,当前系统上运行的每个进程在/proc下都有子目录。目录名称是进程的id,可以通过查看目录中的文件来获取有关该进程的信息。、进程环境、main函数和命令行参数进程的开始和结束环境表和环境变量存储空间布局内存分配setjmp和longjmp函数、内存
8、分配和内存分配的三个函数malloc:分配指定字节数的存储库,此存储库的初始值为calloc:分配指定数量的指定长度的对象的存储空间,此空间中的每个位为0 realloc变更先前配置区域的长度(增加或减少)c中的new、记忆体配置、函数原型void * malloc(size _ t size);Void * calloc (size _ t nobj,size _ t size);Void * realloc (void * ptr,size _ t新大小);注意:三个函数返回的指针必须正确对齐,什么是对齐?-嗯?-嗯?例如,在特定系统中,如果有最严格的排序要求,double必须从8的倍数地
9、址单元格开始,则所有这三个函数返回的指针部分都必须这样排序。释放内存,free函数用于释放分配的内存,并将内存返回为堆函数圆形void free(void *ptr)。内存已分配,但未释放。内存泄漏吗?进程环境、main函数和命令行参数进程的开始和结束环境表和环境变量存储空间布局内存分配setjmp和longgjmp函数、setjmp和longgjmp函数以及void g()void f()g();void main f();首先,在左边的代码中,main函数调用了f函数,在f函数中再次调用了g函数。当g函数内部处理出错时,如何使main函数识别它?setjmp和longjmp函数,void
10、g()void f()g();void main f();g函数内部处理错误,可以通知main函数,可能的方法:使用goto语句?g函数通过返回值通知f函数,f函数通过返回值通知main函数吗?(考虑函数调用的深度)使用setjmp和longjmp处理c异常,setjmp和long jmp函数,setjmp和long jmp函数实现函数之间的跳转函数原型int set jmp(jmp _ buf env);Void长jmp (jmp _ buffenv,intval);Setjmp函数将跳转的目标位置longjmp函数、setjmp和longjmp函数、参数和返回值:env:保留应返回的位置的
11、堆栈情况setjmp的返回值:直接调用函数时返回0。如果由longjmp调用setjmp,则根据val(longjmp的第二个参数)返回演示程序说明两个函数(程序演示4.6),对于每个变量,调用long jmp函数后,main中每个变量的值是否会更改回原始值?程序演示(4.7) g-o test.cpp g-o-o test.cpp全局变量、静态变量、易失性变量在非优化版本中,所有变量都存储在内存中优化版本、自动变量和寄存器变量存储在寄存器中、46、变量回滚、type def struct ununns/堆栈指针寄存器unsigned j _ ss/虚拟段unsigned j _ flag/标
12、志寄存器unsigned j _ cs/代码段unsigned j _ ip/命令指针寄存器unsigned j _ bp/默认地址指针unsigned j _ di/目的指针unsigned j _ es/其他部分unsigned j _ si/源地址unsigned j _ ds/数据段jmp _ buf,47,变量回滚问题,如何在longjmp期间始终存储本地变量的值:声明为volatile变量。适用于在Setjmp执行和longjmp返回之间更改的变量)内存中存储的变量在调用longjmp时具有值,CPU和浮点寄存器中的变量在调用setjmp函数时返回到值优化编译,register和a
13、uto变量都存储在寄存器中,volatile变量存储在内存中,48,变量回滚问题,volatile变量例如,有一个int x,两个线程都读取和写入它。有些编译器或CPU将x存储在寄存器中,读取时,实际x直接读取寄存器的内容,而不是内存中的内容线程1,并将1添加到x。内存中的x值要求2线程2读取x,结果是寄存器(寄存器)、自动变量的潜在问题、# include # define datafile datafile * open _ data(void)file * FPchar databufbufbufsiz;/* setvbuf makes this the stdio buffer */i
14、f(FP=fopen(datafile,r)=null) return (null)If (setvbuf (FP,databuf,bufsiz,_ iolbf)!=0) return(空);return(FP);/* error */问题?自动变量的潜在问题,问题:返回open_data函数后,堆栈中使用的空间由下一个调用函数使用,但标准I/O库使用堆栈中的databuf缓冲区解决崩溃和混乱。使用全局存储空间在堆中进行静态存储空间分配、setjmp和longjmp函数、void g()void f()g();void main f();g函数内部处理错误,可以通知main函数,可能的方法:使用goto语句?g函数通过返回值通知f函数,f函数通过返回值通知main函数吗?(考虑函数调用深度)使用setjmp和long jmp c异常处理(4.12),resourcelimits,every process has a set of resource limits,Some of which can be quire# include # include int getr limit(int resource,structr limit * rl ptr);I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年公司会议纪要标准模板
- 酒店反恐演练方案
- 广西壮族自治区贵港市覃塘区水系连通及水美乡村建设项目环境影响报告表
- 2024年盐山县招教考试备考题库带答案解析
- 2025年哈尔滨华德学院马克思主义基本原理概论期末考试模拟题带答案解析(夺冠)
- 2025年中山职业技术学院马克思主义基本原理概论期末考试模拟题附答案解析(夺冠)
- 2025年重庆信息技术职业学院马克思主义基本原理概论期末考试模拟题附答案解析(必刷)
- 2025年西安思源学院马克思主义基本原理概论期末考试模拟题附答案解析
- 2024年湖南税务高等专科学校马克思主义基本原理概论期末考试题及答案解析(夺冠)
- 2025年兴山县幼儿园教师招教考试备考题库含答案解析(必刷)
- GB/T 19894-2025数码照相机光电转换函数(OECFs)的测量方法
- 2025年北京市物业管理行业市场深度分析及发展前景预测报告
- 旅游景区商户管理办法
- 2025年甘肃省中考物理、化学综合试卷真题(含标准答案)
- DLT5210.1-2021电力建设施工质量验收规程第1部分-土建工程
- 机械设备租赁服务方案
- 乐理考试古今音乐对比试题及答案
- 电影放映年度自查报告
- 水泥窑协同处置危废可行性研究报告
- 心内介入治疗护理
- 初中毕业学业考试命题规范、原则、与教学建议
评论
0/150
提交评论