一起talk C栗子吧(第一百三十七回:C语言实例--查看环境变量)

本文主要是介绍一起talk C栗子吧(第一百三十七回:C语言实例--查看环境变量),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


各位看官们,大家好,上一回中咱们说的是exec系列函数的例子,这一回咱们说的例子是:查看环境变量。闲话休提,言归正转。让我们一起talk C栗子吧!

看官们,我们在前面介绍exec系列函数时提到过程序的运行环境,有些看官可能不太明白,今天我们一起来看看程序运行环境中的环境变量。环境变量在实际编写程序的时候经常使用,比如常用的PATH环境变量。有时候程序无法运行,就是环境变量错误引起的。

环境变量是操作系统提供的一种参数,程序可以通过这些参数来在操作系统中运行,它是本质上是键值对序列。

例如:SHELL=/bin/bash。

其中SHELL是环境变量的名称,它的值是等于号后面的内容,它提示我们运行的shell程序是/bin/bash。我们可以把SHELL看作键,等号后面的内容看作是值。这就是它的本质:键值对。

我们可以在终端中通过命令来查看当前的环境变量,常用的命令有echo,set和env.

环境变量有很多,比如我们常用的SHELL,PATH,可以使用echo命令来查看单个环境变量的值,前提是
你需要知道环境变量的名字。

$ echo $SHELL   //通过echo命令查看单个环境变量的值
/bin/bash
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

如果忘记环境变量的名字,也不要担心,我们可以使用set命令查看当前终端中的环境变量。

$  set //运行set命令
BASH=/bin/bash
HISTFILESIZE=2000
HISTSIZE=1000
HOME=/home/talk8
HOSTNAME=talk8-PC
HOSTTYPE=i686
LOGNAME=talk8

这里只选择了一些常见的环境变量,其它的环境变量就不一一列出了。

此外,env命令也可以查看环境变量,只是它比set命令查看的范围更加大一些。它可以查看到当前系统中所有的环境变量。

$  env //运行env命令
LC_PAPER=zh_CN.UTF-8
TERM=xterm
SHELL=/bin/bash
USER=talk8
USERNAME=talk8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
LANG=zh_CN.UTF-8
HOME=/home/talk8
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
XDG_SESSION_DESKTOP=default
LOGNAME=talk8

系统的环境变量比较多,这里只选择了一些常见的环境变量,其它的环境变量就不一一列出了。

台下已经有不少看官在终端中试验这些命令了,哈哈。不过大家不要忘记我们是talkC粟子呀,除了这些命令可以查看环境变量外,我们也可以在C程序中查看环境变量。

系统提供了getenv函数来查看环境变量,下面是该函数的原型:

     char *getenv(const char *name);
  • 函数只有一个参数,参数是字符指针,用来接收变量名;
  • 函数返回与变量名匹配的值,如果变量名不存在或者变量没有值,返回空指针;

下面是程序的核心代码,请大家参考

    char *env_key = "SHELL";char *env_value = NULL;env_value = getenv(env_key);if(NULL != env_value)printf("the value of %s is %s \n",env_key,env_value);elseprintf("there is not any value of %s \n",env_key);

在代码中我们通过getenv函数获取了环境变量SHELL的值,并且显示到终端中,下面是程序的运行结果:

the value of SHELL is /bin/bash 

大家可以看到,该结果和我们刚才使用echo命令得到的结果完全一致。

大家可能已经感觉到了,使用该函数需要提前知道环境变量名,这点和echo命令一样,有没有像set和env命令一样查看所有环境变量的函数。答案是没有。台下已经看官叹气了,哈哈。看官别失望。没有函数咱们可以自己写一个呀,自己写?怎么写?我给个提示:系统中所有的环境变量都存放在了一个叫environ的变量中,不过该变量是一个指向字符串的指针。它的定义如下:

char **environ;

现在大家明白如何了吗?咱们比一比谁写的快。下面是我写的代码:

    extern char ** environ;char ** env_array = NULL;env_array = environ;while(NULL != *env_array)printf("%s \n",*env_array++);

关于代码,我说几个需要注意的地方:

  • 我们在使用前需要先对environ变量进行声明。
  • 我们可以把该变量当作一个字符串数组,该数组的最后一个元素为空指针。
  • 明白这些后,显示环境变量就和遍历数组一样简单。

程序的运行结果,我就不列出了,相信大家已经自己完成了该程序。大家可以把该程序的运行结果和env命令的运行结果比较一下,你将会发现它们是完全相同的。

看官们,完整的代码放到了我的资源中,大家可以点击这里下载使用。

最后,我们总结一下查看环境变量的方法:

  • 使用Linux命令:echo,set和env.
  • 使用函数:getenv。该函数得到结果和echo相同。
  • 使用变量:environ。该变量得到的结果和env命令的结果相同。

各位看官,关于查看环境变量的例子咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


这篇关于一起talk C栗子吧(第一百三十七回:C语言实例--查看环境变量)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/800203

相关文章

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,