当前课程知识点:基于Linux的C++ > 第十二讲 Linux系统编程基础 > 12.3 程序执行环境(二) > LinuxCPP1203
在程序的运行过程中
不仅仅有命令行的参数
还有一些环境的变量
这些环境变量都是 Linux 操作系统
已经替我们提供好的
当然你也可以设置自己的环境变量
在 Linux 操作系统中
它实际上提供了很多个环境变量
在我们程序运行过程中
其实都可以直接使用
比如讲 USER、HOME、PATH
像这样的 Linux 环境变量
它都有明确的意义
比如讲 USER 表达的就是用户名
HOME 表示的就是这个用户的主目录
PATH 它表示的就是一个分号分隔的 Linux 查找命令的目录列表
PATH 它表示的就是一个分号分隔的 Linux 查找命令的目录列表
所有的这些环境变量都是 Linux 操作系统给我们提供好的
所有的这些环境变量都是 Linux 操作系统给我们提供好的
你在编程的时候实际上是可以直接用的
在 Linux 的 shell 里
你事实上是可以查看这些环境变量的
比如 echo $USER
你就可以看到 $USER
它的环境变量设的值是什么
就是你的用户名字是什么
你也可以在 shell 里设置自己的环境变量
比如讲用 EDITOR 赋值为 emacs
你就可以设定自己的环境变量
环境变量的定义格式是固定的
就 variable=value
前面是变量的名字
等号后面就是变量的值
这个定义的格式是固定的
你可以使用 getenv() 这个函数
env 就是 environment 那个词的前三个字母
getenv() 这个函数来返回环境变量的值
事实上 Linux 全部的环境变量
都是使用一个全局变量 environ 保存起来的
你可以直接用
这个全局变量 environ 它的定义格式是 char **
仍然是一个指向字符的指针的指针
就和我们的 argv 那个性质是一样的
在实际访问和操作环境变量的时候
你就应该导入这个变量 environ
char ** 型式的 environ
然后一个字符串、一个字符串地去处理它
我们看这个例子
编写一个客户端的程序
在用户没有指定服务器名称的时候
使用缺省的服务器的名称
我们定义一个字符串 server_name
就是服务器的名字
这个服务器的名字
理论上当这个服务器运行的时候
它会提供一个环境变量 server_name
getenv() 这个函数去查询这个服务器的名字
查询到了结果就传给 server_name
如果这个 server_name 被赋值了
说明它定义了
它定义的话我们就直接就用
如果没查到的话
我们就使用缺省的名字
所以我们就把 server_name 赋值为 “server.yours.com”
所以我们就把 server_name 赋值为 “server.yours.com”
就把这个网络名字作为服务器的名字就 OK 了
就把这个网络名字作为服务器的名字就 OK 了
按照这个模式操纵我们的环境变量
getenv() 这个函数用变量的名字
作为一个字符串传进去查询
它得到的结果
就是它那个值所对应的字符串
在程序中就按照这个方式处理环境变量
在程序中就按照这个方式处理环境变量
每一个程序在运行结束的时候
它都有一个退出码
对于程序来讲
退出码 就是它结束时
传递给操作系统的那个整型数据
传递给操作系统的那个整型数据
事实上呢 它是 main() 函数的返回值
但有的时候因为我们程序 main() 函数没结束
而是提前终止的
所以调用 exit() 的时候
它也会将退出码传给我们的操作系统
就在 main() 函数之外
其它函数都可以调用 exit()
在程序流程出现异常的时候
返回一个退出码给操作系统
退出码这个变量名称经常使用 exit_code
你不用也可以 你用这个是最好了
一下子就明确了它是退出码
你不用其实关系也不大 这个并不重要
但是同学们要特别记得
在你真正编程的时候
你应该仔细地设计程序的退出码
来确定它们对应于不同的错误
你比如讲 如果出现情况 a
我应该给一个退出码 1
如果出现情况 2 我应该给出退出码 2
如果是正常执行成功退出
程序成功运行了
那我应该给出退出码是什么呢 0
0 表示无错误 非 0 就表示有错误
因为程序正确的路就一条
错误的路有很多
我们要分清
它到底因为什么样的错误才退出的
所以不同的错误理论上
应该给予不同的退出码
并且写成一个帮助手册
别人运行你的程序
看到这样的退出码
一查手册就明白你的程序是因为什么原因而退出的了
一查手册就明白你的程序是因为什么原因而退出的了
所以退出码应该精心地设计
这是特别需要注意的地方
那么对于操作系统来讲呢
当它接收到这个程序退出码以后
它就需要做出响应
如果有必要 就应该执行后续的处理
如果没必要 可能就不管了
大部分时候操作系统事实上
是不关心你程序的退出码的
程序退出码谁关心呢
其实是你后续的程序
在早期批处理的环境下面
前面一个程序退出
它的结果会对后一个程序的运行有影响
而后一个程序就必须分析前一个程序的退出码
而后一个程序就必须分析前一个程序的退出码
才能决定接下来做什么
所以对于操作系统来讲
往往需要响应这个程序的退出码
有时就是简单地传给下一个程序
让下一个程序能够查询到就可以
shell 编程的时候
是可以通过一个命令来查看的
比如讲 echo $?
就可以查看到上一个程序结束时
它的退出码是什么
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口