6 进程的环境

news2024/11/27 11:37:27

6.1 main函数

        C程序总是从main函数开始执行。main函数的原型是:

int main(int argc, char *argv[]) 

6.2 进程终止

有五种方式使进程终止:

(1)正常终止:

        (a)从main返回。

        (b)调用exit。

        (c)调用_exit。

(2)异常终止:

        (a)调用abort

        (b)由一个信号终止

6.2.1 exit和_exit函数

        exit和_exit函数用于正常终止一个程序: _exit立即进入内核,exit则先执行一些清除处理 (包括调用执行各终止处理程序,关闭所有标准I / O流等),然后进入内核。

#include <stdlib.h>
void exit(int status) ;


#include <unistd.h>
void _exit (int status) ;

exit和_exit都带一个整型参数,称之为终止状态(exit status)。大多数UNIX shell都提供检查一个进程终止状态的方法。如果 ( a )若调用这些函数时不带终止状态,或 ( b ) main执行了一个无返回值的return语句,或( c ) main执行隐式返回,则该进程的终止状态是末定义的。

6.2.2 atexit函数

        一个进程可以登记多至 32个函数,这些函数将由exit自动调用。我们 称这些函数为终止处理程序(exit handler),并用atexit函数来登记这些函数。

#include <stdlib.h>

//返回:若成功则为0,若出错则为非0
int atexit(void (*func) (void) ) ;

其中,atexit的参数是一个函数地址,当调用此函数时无需向它传送任何参数,也不期望它返回一个值。 exit以登记这些函数的相反顺序调用它们。同一函数如若登记多次,则也被调用多次。

        exit首先调用各终止处理程序,然后按需多次调用fclose,关闭所有打开流。下图中显示了一个C程序是如何起动的,以及它终止的各种方式。

一个C程序是如何起动和终止的

        内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(调用exit )调用_exit。进程也可非自愿地由一个信号使其终止。

6.3 命令行参数

        当执行一个程序时,调用exec的进程可将命令行参数传递给该新程序。

6.4 环境表

        每个程序都接收到一张环境表。与参数表一样,环境表也是一个字符指针数组,其中每个指针包含一个以null结束的字符串的地址。全局变量environ则包含了该指针数组的地址。

extern char **environ;

例如:如果该环境包含五个字符串,那么它看起来可能如下图中所示。

其中,每个字符串的结束处都有一个null字符。我们称environ为环境指针,指针数组为环境表, 其中各指针指向的字符串为环境字符串。

6.5 C程序的存储空间布局

C程序一直由下列几部分组成:

  • 正文段(代码段)。这是由CPU执行的机器指令部分。通常,正文段是可共享的,所以即使是经常执行的程序(如文本编辑程序、C编译程序、shell等)在存储器中也只需有一个副本,另外,正文段常常是只读的,以防止程序由于意外事故而修改其自身的指令。
  • 初始化数据段。通常将此段称为数据段,它包含了程序中需赋初值的变量。例如, C程序中任何函数之外的说明。
  • 非初始化数据段。通常将此段称为 bss段,这一名称来源于早期汇编程序的一个操作符, 意思是“block started by symbol(由符号开始的块)”,在程序开始执行之前,内核将此段初始化为0。函数外的说明。
  • 栈。自动变量以及每次函数调用时所需保存的信息都存放在此段中。每次函数调用时, 其返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。然后,新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈, C函数可以递归调用。
  • 堆。通常在堆中进行动态存储分配。由于历史上形成的惯例,堆位于非初始化数据段顶和栈底之间。

 6.6 存储器分配

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

(1)malloc。分配指定字节数的存储区。此存储区中的初始值不确定。

(2)calloc。为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位 (bit)都初始化为0。

(3)realloc。更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。

#include <stdlib.h>

//三个函数返回:若成功则为非空指针,若出错则为NULL
void *malloc(size_t size) ;
void *calloc(size_t nobj, size_t size) ;
void *realloc(void *ptr, size_t newsize) ;

void free(void *ptr)

6.7 环境变量

        环境字符串的形式是:name = value

        函数getenv,可以用其取环境变量值。

#include <stdlib.h>

//返回:指向与name关联的value的指针,若未找到则为NULL
char *getenv(const char *name) ;

        除了取环境变量值,有时也需要设置环境变量,或者是改变现有变量的值,或者是增加新的环境变量。

#include <stdlib.h>

//两个函数返回:若成功则为 0,若出错则为非0
int putenv(const char *str) ;
int setenv(const char *name, const char * value, int rewrite) ;

void unsetenv(const char *name) ;

这三个函数的操作是:

  • putenv取形式为name=value的字符串,将其放到环境表中。如果 name已经存在,则先删除其原来的定义。
  • setenv将name设置为value。如果在环境中name已经存在,那么( a )若rewrit e非0,则首先 删除其现存的定义;( b )若rewrite为0,则不删除其现存定义(name不设置为新的value,而且也不出错)。
  • unsetenv删除name的定义。即使不存在这种定义也不算出错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm十种不为人所知的技巧,不得不知道

Pycharm是Python语言开发中的一个非常强大的IDE工具&#xff0c;其高度的定制能力、日常开发中常用的工具和各种快捷键等功能&#xff0c;都能帮助Pycharm用户提高开发效率。但是&#xff0c;Pycharm中的许多功能并不为人所知。因此&#xff0c;以下是十种Pycharm技巧&#xff…

【MCS-51】51单片机指令系统大全

指令是指挥微型计算机工作的的计算机命令&#xff0c;对于51单片机来说&#xff0c;其主要使用的指令有两种形式&#xff1a;机器语言指令和汇编语言指令。 机器语言指令是指使用二进制代码表示的指令&#xff1b; 汇编语言指令是指使用容易我们记忆的缩写符号表示的机器语言…

YOLO入门指南:理解YOLO原理及构建第一个目标检测模型

YOLO&#xff08;You Only Look Once&#xff09;是一种快速且准确的目标检测算法&#xff0c;可以在图像或视频中检测出多个对象的位置和类别。在本篇文章中&#xff0c;我们将介绍YOLO的基本原理&#xff0c;并使用TensorFlow构建第一个目标检测模型。 YOLO的基本原理 YOLO的…

linux 安装jdk、tomcat

文章目录 前言一、Linux上安装jdk1、jdk安装与配置过程2、linux查看jdk安装路径 二、Linux上安装tomcat1、tomcat安装与配置过程2、对外开放访问的端口、重启防火墙、查看日志 三、在window系统中通过浏览器访问 前言 先检察是否安装jdk java -jar ## 查看是否安装jdk java -…

K8S—Helm

一、Helm介绍 helm通过打包的方式&#xff0c;支持发布的版本管理和控制&#xff0c;很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理&#xff08;Deployment、Service等&#xff09;可配置&#xff0c;能动态生成。通过动态生成K8S资源清单文件&a…

文笔润色-文本校对改写工具

文段改写软件 写作是一项对于很多人来说都需要频繁进行的活动&#xff0c;无论是工作中的商业写作还是学术写作&#xff0c;在完成优质内容的同时也需要付出大量的时间和精力进行语言润色和修改。然而&#xff0c;现在有了147ChatGPT改写润色软件&#xff0c;该软件可以全自动…

近期分享学习心得

1、数据类型 原始类型undefined null number string boolean symbol bigint 引用类型 对象 2、大厂为什么不允许赋值undifined&#xff1f; 必须let avoid 0;效果一样 void是关键字&#xff0c;后面跟表达式&#xff0c;无论跟啥最终制造undefined&#xff0c;但是习惯写0。…

动态规划设计

文章目录 动态规划设计一、什么是最长递增子序列&#xff1f;[300. 最长递增子序列](https://leetcode.cn/problems/longest-increasing-subsequence/)注意子序列和子串的区别&#xff1a; 二、动态规划解法2.1什么是数学归纳法&#xff1f;2.2最长递增子序列中数学归纳的实际应…

simulink电力系统仿真(1):电力系统库+(电力系统基础知识)

文章目录 基础知识仿真库搭建一个简单的电路 基础知识 ★三相交流电&#xff1a;三相电是三组幅值相等、频率相等、相位互相差120的交流电&#xff0c;由有三个绕组的三相发电机产生&#xff0c;是工业上常用的电源&#xff0c;可提供超过数千瓦或以上功率的电力。★电力系统暂…

看一看吧,面试真的卷......

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;今年面试实在是太卷了&#xff0c;不知道从何下手&#xff01; 不论是跳槽涨薪&#xff0c;还是学习提升&#xff01;先给自己定一个小目标&#xff0c;然后再朝着目标去努力就完事儿了&#xff01; 为了帮大家节约…

美术培训学校学生作品管理平台

本系统主要是为了美术培训学校和学生使用的&#xff0c;系统分为了前台和后台两部分&#xff0c;前台部分主要是展示美术培训学校的信息和让学生查看自己的课程信息服务的&#xff0c;后台主要是管理人员对系统进行管理使用的 前台部分功能 1. 网站首页&#xff0c;首页部分…

jar的反编译为java文件

目录 1、cfr工具下载 2、反编译指令 3、反编译说明 1、cfr工具下载 反编译插件工具比较多&#xff0c;但是我认为最后用的工具为cfr&#xff0c;基本能解决所有jar包&#xff0c;下载地址为&#xff1a;cfr官网 点击图中位置下载即可 2、反编译指令 来到你下载完成cfr目录下&…

蓝牙耳机哪个牌子好?数码粉总结学生平价蓝牙耳机推荐

蓝牙耳机这几年发展飞速&#xff0c;涌现了很多品牌和产品&#xff0c;越来越多的用户选择放弃有线耳机使用蓝牙耳机&#xff0c;学生们也不例外。前段时间看到网上很多学生在讨论蓝牙耳机哪个牌子好&#xff0c;我整理了五款口碑最好的学生平价蓝牙耳机推荐清单&#xff1a; 1…

cesium坐标系转换:经纬度地理坐标系 弧度地理坐标系 笛卡尔坐标 屏幕坐标之间的相互转换

参考了网上资料 核心就是 cesium 计算的地理数据用弧度坐标系表示&#xff08;很多公式计算出来的是弧度结果&#xff09;&#xff0c;我们采集的数据是经纬度表示的&#xff08;即我们正常的经纬度&#xff09;&#xff0c;围绕着cesium球体展示的用笛卡尔坐标系计算的其方位…

5月新刊 | MDPI版面费将全面上涨,还有哪些期刊可投?(新增多领域高性价比新刊, 含CCF-B/SSCI/EI)~

近期MDPI官方发布消息称&#xff0c;MDPI出版社旗下期刊的OA论文处理费 (APC), 价格将在2023年6月底上涨&#xff0c;超过90种OA期刊的APC涨幅在200-1200瑞士法郎 (折合人民币1560元-9300元)。 在MDPI出版的OA期刊中&#xff0c;有5种期刊处于2022年中国通迅作者发表OA论文数量…

junit如何在多模块项目中使用

文章目录 前言一、最简单的单元测试二、springboot多模块测试单元1.问题2.解决 总结 前言 相信后端的小伙伴对于junit测试应该不陌生,当我们写好了一些功能之后,由于不太放心是否会出现问题,我们会选择自测; 第一种 通过类似postman之类的,直接走接口测试第二种 由于构造数据…

Halcon 找到产品上 圆圈中的7个点

文章目录 1 关键实现环节演示2 完整代码 及 原图文章目录 1 关键实现环节演示2 完整代码 及 原图找到下图 圆圈中的7个点; 思路: 先找到圆圈外面的矩形, 再找到里面的圆圈, 最后找到圆圈里面的 圆点 1 关键实现环节演示 二值化 阈值分割止 之后,打散, read_image (im…

很多博主用Markdown格式文章?直呼真不错!

概述 Markdown 是一种轻量级标记语言&#xff0c;它可以使我们专注于写作内容&#xff0c;而不用过多关注排版&#xff0c;很多博主、作家等都用它来撰写文章~ 本文将给各位小伙伴介绍 Markdown 语法的使用&#xff0c;本篇文章索奇就是用的纯 markdown 语法来写的~ 标题 一级…

EKMA曲线绘制、MCM箱模型应用与O3形成途径、生成潜势、敏感性分析

目录 EKMA曲线及大气O3来源解析 MCM箱模型实践技术应用与O3形成途径、生成潜势、敏感性分析 一、 大气中O3形成知识基础、MCM和Atchem2原理及Linux系统安装 二、 MCM建模、数据输入、模型运行及结果输出 【讲解案例操作】 三、 O3形成途径、生成潜势及其敏感性分析 【讲解…

2023 谷歌I/O发布会新AI,PALM 2模型要反超GPT-4,一雪前耻!

文章目录 1 前言2 Google I/O 发布者大会3 PaLM 2模型3 Bard项目4 其他AI工具4.1 AI 图片编辑 Magic Editor4.2 Duet AI 办公4.3 Universal Translator 翻译工具4.4 Google 沉浸式导航4.5 Google 搜索引擎 5 讨论 1 前言 每年必看两大会&#xff0c;苹果发布会和谷歌发布会&am…