当前课程知识点:基于Linux的C++ >  第十二讲 Linux系统编程基础 >  12.3 程序执行环境(二) >  LinuxCPP1203

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP1203在线视频

LinuxCPP1203

下一节:LinuxCPP1204

返回《基于Linux的C++》慕课在线视频列表

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 $?

就可以查看到上一个程序结束时

它的退出码是什么

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP1203笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。