PostgreSQL 环境变量相关代码解析

栏目: 数据库 · 发布时间: 4年前

内容简介:PostgreSQL 启动和运行过程中会依据环境变量做某些操作或设置,比如 initdb 时默认使用环境变量设置数据库的编码方式。在 Linux Shell 上无论是启动 PostgreSQL 或者某个独立进程(比如 initdb、pgdump 等),Shell 作为它们的父进程 fork 出子进程,fork 会把父进程的环境变量复制给子进程,然后子进程调用 exec() 函数启动相应的程序,这样我们的 PostgreSQL 就拿到了所有的环境变量了。基本的原理清楚了,那从具体代码角度讲,PostgreSQ

PostgreSQL 启动和运行过程中会依据环境变量做某些操作或设置,比如 initdb 时默认使用环境变量设置数据库的编码方式。在 Linux Shell 上无论是启动 PostgreSQL 或者某个独立进程(比如 initdb、pgdump 等),Shell 作为它们的父进程 fork 出子进程,fork 会把父进程的环境变量复制给子进程,然后子进程调用 exec() 函数启动相应的程序,这样我们的 PostgreSQL 就拿到了所有的环境变量了。

基本的原理清楚了,那从具体代码角度讲,PostgreSQL 是如何获取到环境变量的呢?

某个具体的环境变量是一个 key=value 模式的字符串,所有的 key=value 模式的字符串构成了环境变量表。在 libc 库中定义了一个全局环境变量表的指针 environ,在代码中只要访问该指针即可获取到环境变量。

程序中如何使用环境变量

与环境变量相关的 libc 库函数包含了 getenv()、setenv()、unsetenv() 这三个函数,顾名思义不再详细叙述,但需要注意的是它们的使用需要引用 stdlib.h 头文件,

也可以直接解析 environ 指针,需要在源文件中 extern 一下;或者引入 unistd.h 头文件,但要提前声明 __USE_GNU 宏。

extern char ** environ;
#define __USE_GNU
#include <unistd.h>

当然,也可以使用另外一种 main() 函数的声明方法,引入环境变量的指针。

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

PostgreSQL 中的环境变量

打印输出环境变量

在 PostmasterMain() 函数中打印输出了所有的环境变量,代码如下所示:

/* For debugging: display postmaster environment */
{
	extern char **environ;
	char	  **p;

	ereport(DEBUG3,
			(errmsg_internal("%s: PostmasterMain: initial environment dump:",
							 progname)));
	ereport(DEBUG3,
			(errmsg_internal("-----------------------------------------")));
	for (p = environ; *p; ++p)
		ereport(DEBUG3,
				(errmsg_internal("\t%s", *p)));
	ereport(DEBUG3,
			(errmsg_internal("-----------------------------------------")));
}

设置 ps 输出的标题

PostgreSQL 会实时更改 ps 命令输出中的标题,用以提示 PostgreSQL 的进程当前的状态,这个功能的主要代码逻辑在 ps_status.c 文件中。更改 ps 输出标题的方法因操作系统平台的不同而各不相同,但 Linux 平台和大多数的 System-V 平台都可以使用覆写入参和环境变量区域的方法来实现。

在这些平台上,main() 函数中的 argv 和 environ 环境变量表都在一块连续的内存区域内,不同的字符串用 ‘\0’ 或空格隔开。主要代码逻辑集中在 save_ps_display_args() 函数中。

未完待续。

Advertisements


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

驯服烂代码

驯服烂代码

伍斌 / 机械工业出版社 / 2014-11 / 69.00

Kent Beck、Martin Fowler、Michael C. Feathers、Robert C. Martin、Joshua Kerievsky、Gerard Meszaros等大师们的传世著作为如何提升编程技艺和代码质量提供了思想和原则上的指导,本书则为实践和融合这些思想、原则提供了过程和方法上指导。本书通过编程操练的方式讲述了如何用TDD(测试驱动开发)的方法来驯服烂代码,通过结对编......一起来看看 《驯服烂代码》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具