热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

APUE(第七章)进程环境

mainintmain(intargc,char**argv);或者intmain(intargc,char*argv[]);具体参数描述看:关于intmain(

main

int main(int argc,char **argv);//或者
int main(int argc,char *argv[]);

具体参数描述看:关于int main( int argc, char* argv[] ) 中arg和argv参数理解


进程终止


  • 正常终止

    • 从main函数返回
    • 调用exit
    • 调用_exit或_exit
    • 最后一个线程从其启动例程返回
    • 从最后一个线程调用pthread_exit
  • 异常终止

    • 调用abort
    • 接收到一个信号
    • 最后一个线程对取消请求做出响应

退出函数,_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核


#include
void exit(int status);
void _Exit(int status);
#include
void _exit(int status);

  • status是退出状态,或者终止状态

  • exit总是执行IO库的清理关闭操作,对于所有打开的流调用fclose函数,缓冲的数据都将被冲洗

  • 在main函数返回一个整型值与用该值调用exit是等价的,即exit(0)等价return(0)


函数atexit


ISO C规定一个进程可以登记多至(这里是多至不是最多,一定要注意其词语含义),这些函数由exit自动调用。我们称这些函数为终止处理程序,并调用atexit函数来登记这写函数

#include
int atexit(void (*func)(void));//成功返回0,出错返回非0

  • 同一函数如若登记多次,也会被调用多次
  • 以出栈的方式去调用

ISO C与POSIX.1的规定:exit首先调用各终止处理程序,然后关闭(通过fclose)所有打开流

一个C程序的运作如下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRaXhyqh-1639980979216)(https://raw.githubusercontent.com/dwnb/Picture/master/20211220105535.png)]


命令行参数

具体参数描述看:关于int main( int argc, char* argv[] ) 中arg和argv参数理解


环境表


  • 每个程序都收到一个环境表
  • 环境表是一个字符指针数组
  • 每个指针包含一个以null结束的c字符串地址
  • 全局变量environ则包含了该指针数组地址,environ为环境指针,指针数组为环境表

extern char **environ

环境由name(名)=value(值)


C程序存储空间布局


C程序由以下几个部分组成



  • 正文段。cpu执行机器指令的部分。通常正文段可共享的。所以即使频繁执行的程序在存储器中也只有一个副本,正文段常常是制度的,以防意外而修改其指令

  • 初始化数据段。通常将此段称为数据段,它包含了程序中需要明确的赋初值的变量,例如;全局变量的赋初值

  • 未初始化数据段

  • 栈,自动变量以及每次函数调用时所需的保存信息都存放此段中。每次函数返回时,其返回地址及调用者环境信息都存放在栈中。

  • 堆。通常在对中进行的是动态存储分配,堆位于未初始化数据段和栈之间


典型存储空间安排如下




  • 未初始化数据段内容不存放在磁盘里,内核在程序运行前将他们都设置未0

共享库

具体可以参考Linux 静态库和动态库


  • 静态链接编译时加static关键字
  • 动态链接加-l 后跟库

存储空间分配


3个用于存储空间动态分配的函数


#include
void *malloc(size_t size);
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr,size_t newsize);//3个函数返回值:若成功返回空指针,出错返回NULL
void free(void *ptr);//释放内存

  • malloc,分配指定字节数存储区。此存储区的初始值不确定
  • calloc,为指定数量指定长度的对象分配存储空间。该空间中的每一位(bit)都初始化为0
  • realloc,增加或减少以前分配区的长度。增加长度时可能需要将以前分配区的内容转移到另一个足够大的分配区,以便在尾端提供增加存储区,新增区域内初始值不确定
  • 3个分配函数指针适当对齐,使其可用于任何数据对象。例如:如果在一个特定的系统上,最苛刻的对其要求是double必须在8的倍数地址单元处开始,3个返回指针都必须这样对齐
  • 3个返回值为泛化指针void *
  • free释放ptr指向的空间,被释放空间的进入储区池,供以后分配
  • realloc的第2个参数是新空间的长度,不是新旧之差,ptr为null时,功能与malloc相同
  • 这些分配通常用sbrk系统调用实现

环境变量


获取环境变量,注意环境变量格式:name(名)=value(值)


#include
char *getenv(const char *name);//返回指向name关联的value指针,未找到返回null

  • 返回指向name关联的value指针,使用getenv获取的时一个指定变量的值

#include
int putenv(char *str);//成功0,出错非0
int setenv(const char *name,const char *value,int rewrite);
int unsetenv(const char *name);//成功0,出错-1

  • putenv取形式为name=value的字符串,放入环境表,name存在则先删除原来定义
  • setenv将name设置为value。若已存在rewrite非0,删除现有定义替换为rewrite,若为0,则不替换也出错
  • unsetenv删除name定义,即使不存在这种定义也不算出错



函数setjmp和longjmp


跨越函数跳转功能的函数



函数getrlimit和setrlimit


进程资源限制查询和更改



参考

《APUE》
Linux 静态库和动态库


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
author-avatar
Ax珊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有