当前课程知识点:基于Linux的C++ > 第十二讲 Linux系统编程基础 > 12.5 程序执行环境(四) > LinuxCPP1205
接下来一个概念就是系统日志
日志是什么东西呢
日志就是系统和程序运行的记录
Linux 操作系统呢有一个系统日志的进程
叫 syslogd 现在叫 rsyslogd 做了升级
这两个进程都是守护进程 都是 daemon
什么叫守护进程呢
所谓守护进程 它就是在后台运行的进程
它是没有控制终端的
也不接受用户的输入
它的父进程通常都是 init 进程
就是 0 号进程
日志文件 它实际上是一个设备
一般对应于 “/dev/log” 这个文件
日志文件的名字一般是 “/dev/log”
但实质上是一个设备
日志信息一般不保存在这个文件里
事实上是保存在 “/var/log” 这个下面
目录下边你可以设定
日志文件的名字叫什么
rsyslogd 既能够接收用户进程输出的日志
也能接收内核的日志
它都可以接收的
在接收到特定的日志信息之后
rsyslogd 这个进程会把这个接收到的信息
输出到特定的日志文件中去
这个日志信息本身的分发
用户是可以配置的
你可以选 有好几个日志处理的函数
比如讲日志生成函数 syslog()
这个函数呢 可变的参数列表
第一个参数是 priority
表示日志的级别
写日志的时候 它的日志的优先级
往往是一个特定的设施值
与它的日志级别的位或
它是个日志优先级嘛
有一个设施值
还有一个日志级别
这个日志级别实际上有 8 个级别
从 0 级一直到 7 级
数字越大 它的级别实际上就是越低
0 级是最重要的
对吧 就是这个意思
总共 8 个日志级别
设施值呢 它有一些预设的选项
有一些预设的参数
这些预设的参数
一般我们用的就是 LOG_USER
用它和我们的日志级别去位或的
去或的结果其实就能够得到
它对应的日志级别
日志的优先级就决定什么级别的优先级
日志我们会记录什么级别的日志
我们就不记录了 就这个意思
syslog() 做的就是这个事
第一个 priority 用来表达它的日志优先级
message 就是它的日志的信息的构造
它是一个结构化的输出
就像 printf() 一样
这个日志的函数
它的头文件是在 “syslog.h” 里
还有打开一个日志的操作用的 openlog()
它有三个参数 一个是 ident
一个是logopt 一个是 facility
openlog() 这个函数用来改变 syslog() 函数的默认的输出方式
openlog() 这个函数用来改变 syslog() 函数的默认的输出方式
让你能够进一步地结构化你的日志的信息
让你能够进一步地结构化你的日志的信息
比如讲 ident 用来表达标志项
你可以指定一个标志串
你比如说在生成这个日志的时候
它前面会输出日期和时间
然后你可以在后边封装一条附加的字符串信息
然后你可以在后边封装一条附加的字符串信息
比如说这是谁谁谁、某某某
在什么什么时候
什么什么地方的
诸如此类的附加信息
你可以用它
用 ident 这个参数传进去
把这个信息也给它输出了
就这个意思
logopt 它是一个特定的日志选项
用来配置我们的 syslog() 函数的行为的
它有一些就像 LOG_PID、像 LOG_CONT、
像 LOG_ODELAY 等等
可以按照这个方式对它进行配置
facility 就是它的设施值
你可以修改 syslog() 这个函数的默认设施值
一般情况下面我们都不改
就用 LOG_USER
还有一个函数叫 setlogmask()
用于对日志进行一些特定的过滤
你传一个 maskpri
就是设定它的优先级的掩码
大于这个值的所有的日志
它实际上就全部就过滤掉了
它就不管了 日志想关闭
就调用 closelog() 这个函数
在 Linux 操作系统中
每一个进程都有两个用户 ID
一个叫 UID 一个叫 EUID
UID 就是用户 ID
EUID 就是有效用户 ID
那么 UID 对应的其实就是真实用户 ID
提供一个有效用户 ID 的目的是什么呢
就是为了方便资源的访问
运行程序的用户
拥有该程序有效用户的权限
这是非常重要的一个地方
和用户的性质是类似的
所以有一个组 ID
还有一个有效组 ID
关于用户信息处理的话
它都有对应的 Get/Set 函数
有存取函数
比如讲获取真实用户 ID
获取有效用户 ID 获取真实组 ID
获取有效组 ID
像 getuid()、geteuid()、getgid()、getegid()
诸如此类
还有设置 有 Get 也有 Set
都是成对的
所以真实用户 ID 有 Get/Set
有效用户 ID 有 Get/Set
组也一样 这么八个函数
这些函数用起来都很简单
所以我们只使用一个简单的例子
调用 getuid()、geteuid()
获得用户 ID 和有效用户 ID
然后把这个信息输出
这个就是我们整个程序运行的结果
我们编译这个 “main.c” 之后
我们去运行
你就能够看到它的用户 ID 和有效用户 ID
初始时候都是我的
这样的话 用户 ID 和有效用户 ID 都是 1000
然后我们会 sudo chown
改变它 把它设成 root
变成根用户的
我又改了 chmod
UID 我没改变
然后 EUID 有效用户 ID 就变成 0
就是它就可以像 root 一样用了
-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 编程实践
-第十五讲 网络编程--编程实践提交入口