[APUE]第七章 进程环境

本文详细探讨了进程环境,包括main函数的调用过程、命令行参数传递、存储器布局、存储空间分配、环境变量使用及进程终止方式等内容。同时介绍了setjmp与longjmp函数的应用,并对C程序的存储空间布局进行了深入解析。

第七章 进程环境

引言:

main函数是如何调用的

命令行参数是如何传送给执行程序的

典型的存储器布局是什么样式

如何分配另外的存储空间

进程如何使用环境变量

各种不同进程的终止方式

longjmp和setjmp

start

进程的终止

正常终止:

从return返回

调用exit

调用_exit、_Exit

最后一个线程从其启动例程返回

最后一个线程调用phread_exit

异常终止:

调用abort

接受一个信号终止

最后一个线程对取消请求作出反应

void exit(int status)
void _exit(int status)
void _Exit(int status)

exit函数总是执行一个标准I/O库的清理关闭操作,为所有打开的流调用fclose,执行各终止处理函数(atexit())

int atexit(void (*func) (void))

在进程即将退出的时候调用这些注册的清理函数,调用的顺序和注册的顺序相反。,并且如果你注册一个函数两次,那么就会调用终止处理函数两次。

环境表:

环境表就是一个字符指针数组,其中每一个指针包含一个以NULL结束的c字符串的地址。全局变量environ包含了该指针数组的地址

extern char** environ,
environ和main函数传进来的argv参数类似,2维最后一项都是NULL指针。
char * getenv(const char* name) //获取名为name的环境变量所对应的value,
int putenv(char* str)                           //add
int setenv(const char* name, constchar*value, int rewrite)//set
int unsetenv(const* name)//delete

其中:

putenv str是name=value的字符串格式,如果name已经存在,则删除原来的

setenv 是修改name所对应的value 如果rewrite为非0 name存在,则覆盖,如果rewrite为0,就不覆盖

unsetenv删除环境变量中key位name的值

c程序的存储空间布局

从历史上讲,C程序一直由下面几部分组成:

(1) 栈
由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈,C函数可以递归调用。递归函数每次调用自身时,就使用一个新的栈帧,因此一个函数调用实例中的变量集不会影响另一个函数调用实例中的变量。
a.局部变量
b.函数调用时返回地址
c.调用者的环境信息(例如某些机器寄存器)

(2) 堆
需要由程序员分配释放管理,若程序员不释放,程序结束时可能由OS回收。通常在堆中进行动态存储分配。
如程序中的malloc, calloc, realloc等函数都从这里面分配。堆是从下向上分配的。

(3) 非初始化数据段
通常将此段称为bss段,这一名称来源于早期汇编程序的一个操作符,意思是“block started by symbol(由符号开始的块)”,未初始化的全局变量和静态变量存放在这里。在程序开始执行之前,内核将此段初始化为0。函数外的说明:long sum[1000] ; 使此变量存放在非初始化数据段中。
a.未初始化的全局变量
b.未初始化的静态变量

(4) 初始化的数据
通常将此段称为数据段,它包含了程序中需赋初值的变量。初始化的全局变量和静态变量存放在这里。例如,C程序中任何函数之外的说明:int maxcount = 99; 使此变量以初值存放在初始化数据段中。
a.初始化的全局变量
b.初始化的静态变量

(5) 正文段
CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常环境指针环境表环境字符串执行的程序(如文本编辑程序、C编译程序、s h e l l等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。


int setjmp(jmp_buf env)
void longjmp(jmp_buf env, int value)
setjmp第一次调用初始化env,函数返回0,在longjmp中调用返回的时候,setjmp返回的是longjmp的value


【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍了基于Matlab的建模与仿真方法。通过对四轴飞行器的动力学特性进行分析,构建了非线性状态空间模型,并实现了姿态与位置的动态模拟。研究涵盖了飞行器运动方程的建立、控制系统设计及数值仿真验证等环节,突出非线性系统的精确建模与仿真优势,有助于深入理解飞行器在复杂工况下的行为特征。此外,文中还提到了多种配套技术如PID控制、状态估计与路径规划等,展示了Matlab在航空航天仿真中的综合应用能力。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程技术人员,尤其适合研究生及以上层次的研究者。; 使用场景及目标:①用于四轴飞行器控制系统的设计与验证,支持算法快速原型开发;②作为教学工具帮助理解非线性动力学系统建模与仿真过程;③支撑科研项目中对飞行器姿态控制、轨迹跟踪等问题的深入研究; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注动力学建模与控制模块的实现细节,同可延伸学习文档中提及的PID控制、状态估计等相关技术内容,以全面提升系统仿真与分析能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值