环境变量编程

news2024/9/23 23:35:28

问题

main 函数 (默认进程入口)

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

  • argc - 命令行参数个数
  • argv[] - 命令行参数数组
  • env[] - 环境变量数组 (最后一个元素为 NULL)

什么是环境变量?

环境变量是进程运行过程中可能用到的 "键值对" (NAME = VALUE)

进程拥有一个环境表 (environment list),环境表包含了环境变量

环境表用于记录系统中相对固定的共享信息 (不特定于具体进程)

进程之间的环境表相对独立 (环境表可在父子进程之间传递)

环境表的构成

全局指针 environ 指向当前进程的环境表,环境表是一个字符串数组,数组中的每一个字符串都是一个环境变量,数组的最后最后一项为 NULL,表示环境表的结束

环境变量初探

parent.c

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

#define EXE "child.out"

int create_process(char* path, char* args[], char* env[])
{
    int ret = fork();
    
    if( ret == 0 )
    {
        execve(path, args, env);
    }
    
    return ret;
}

int main()
{
    char path[] = EXE;
    char arg1[] = "hello";
    char arg2[] = "world";
    char* args[] = {path, arg1, arg2, NULL};
    
    printf("%d begin\n", getpid()); 
    
    printf("%d child = %d\n", getpid(), create_process(EXE, args, args));   
    
    printf("%d end\n", getpid());
    
    return 0;
}

child.c

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char* argv[], char* env[])
{
    int i = 0;
    
    sleep(1);
    
    printf("process parameter:\n");
    
    for(i=0; i<argc; i++)
        printf("exec = %d, %s\n", 
                       getpid(), argv[i]);
                       
    printf("environment list:\n");
    
    i = 0;
    
    while( env[i] )
        printf("exec = %d, %s\n", 
                       getpid(), env[i++]);
					   
	return 0;
}

parent.c 中会创建子进程运行 child.out 程序,并传递给子进程 进程参数 和 环境变量,传递给子进程的环境变量和进程参数的值是一样的

程序运行结果如下图所示:

 通过打印可以看出,子进程的进程参数和环境变量的值是一样的

我们直接在命令行中运行 chlid.out 程序

在命令行中执行 child.out 程序, 打印出来的环境变量是父进程命令行传递过来的,所以 child.out 这个进程的环境变量和命令行的环境变量值是相同的

深入理解环境变量

对于进程来说,环境变量是一种特殊的参数

环境变量相对于 启动参数 较稳定 (系统定义 且 各个进程共享)

环境变量遵守固定规范 (如:键值对,变量名大写)

环境变量 和 启动参数 存储于同一内存区域 (私有)

环境变量读写接口

头文件: #include <stdlib.h>

读: char* getenv(const char* name);

返回 name 环境变量的值,如果不存在,返回 NULL

写: int putenv(char* string);

设置 / 改变 环境变量 (NAME=VALUE),string 不能是栈上定义的字符串

环境表入口:  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Bert,ERNIE,进行中文文本分类

GitHub - 649453932/Bert-Chinese-Text-Classification-Pytorch: 使用Bert&#xff0c;ERNIE&#xff0c;进行中文文本分类使用Bert&#xff0c;ERNIE&#xff0c;进行中文文本分类. Contribute to 649453932/Bert-Chinese-Text-Classification-Pytorch development by creatin…

centos通过源文件的方式安装node-red

centos通过源文件的方式安装node-red 一、下载源文件1.1 查看系统信息1.2 下载 二、安装配置2.1 安装nodejs2.2 安装node-red 三、pm2管理node-red进程3.1 pm23.2 node-red设置开机自启动 四、更多 [回到目录] 一、下载源文件 1.1 查看系统信息 查看你的Linux系统是32位还是6…

三、1如何运用设计原则之SOLID原则写出高质量代码?

你好我是程序员雪球。接下来我们学习一些经典的设计原则。其中包括SOLID&#xff0c;KISS&#xff0c;YAGNI&#xff0c;DRY&#xff0c;LOD等。其实这些设计原则从字面意思理解并不难。但是“看懂”和“会用”是两回事&#xff0c;而“用好”就难上加难了。 先来了解SOLID原则…

EMC学习笔记(十三)背板的EMC设计

背板的EMC设计 1.背板槽位的排列1.1 单板信号的互联要求1.2 单板板位结构1.2.1 板位结构影响1.2.2 板间互联电平、驱动器件的选择 2.背板的EMC设计2.1 接插件的信号排布与EMC设计2.1.1 接插件的选型2.1.2 接插件模型与针信号排布 2.2 阻抗匹配2.3 电源、地分配 1.背板槽位的排列…

深度学习的技术原理

目录 人工智能 深度学习的应用场景 神经网络 卷积神经网络&#xff08;CNN&#xff09; 一个神经网络运行的可视化展示 人工智能 信息技术是人类历史上的第三次工业革命&#xff0c; 计算机、 互联网、智能家居等技术的普及极大地方便了人们的日常生活。 通过编程的方式&…

xshell安装jdk1.8环境

xshell安装jdk1.8环境 大家好&#xff0c;今天我们来学习一下xshell安装jdk1.8环境&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 进入xshell官网下载 第二步 打开xshell新建一个会话&#xff0c;如下图&#xff1a; 第三步 输入你的名称、主机ip、端口号(…

Nginx负载均衡与动静分离

一、Nginx负载均衡&#xff1a; 1.概述&#xff1a; Nginx是一款http服务器软件&#xff0c;支持高达50000个并发连接数的响应。 &#xff08;1&#xff09;拥有强大的处理静态资源的能力。 &#xff08;2&#xff09;运行稳定。 &#xff08;3&#xff09;CPU&#xff0c…

nginx+tomcat负载均衡和动静分离

目录 1.部署nginx 2.部署两台tomcat 3.配置nginx 1.部署nginx vim /vim/lib/systemd/system/nginx.service 2.部署两台tomcat 进入第一台装第一个tomcat vim /etc/profile vim /usr/local/tomcat/webapps/test/index.jsp 重启 进入第二台安装第二台tomcat vim /usr/local/tom…

【电路原理学习笔记】第2章:电压、电流和电阻:2.1 原子结构

第2章&#xff1a;电压、电流和电阻 2.1 原子结构 元素&#xff1a;不能用化学方法分解成更简单形式的物质称为元素。原子&#xff1a;原子是体现元素特性的最小粒子。原子核&#xff1a;原子核由质子和中子组成&#xff0c;质子带有正电荷&#xff0c;中子呈中性。电子带有负…

原型模式的学习与使用

1、原型模式的学习 当我们需要创建一个对象&#xff0c;并且该对象的创建过程比较复杂或者耗时时&#xff0c;可以使用原型模式。原型模式通过复制现有对象的属性来创建新的对象&#xff0c;而不是从头开始创建。   在原型模式中&#xff0c;我们定义一个原型接口或抽象类&am…

CMU 15-445 -- Buffer Pool - 03

CMU 15-445 -- Buffer Pool - 03 引言Buffer PoolsBuffer Pool ManagerLock 和 Latch 的区别PAGE TABLE 和 PAGE DIRECTORYMultiple Buffer PoolsPrefetchingScan SharingBuffer Pool BypassOS Page Cache Buffer Replacement PoliciesLRUClockLRU 与 Clock 的问题LRU-KLocaliz…

如何优雅的将 Docker 镜像从 1.43G 瘦身到 22.4MB

Docker 镜像的大小对于系统的 CI/CD 等都有影响&#xff0c;尤其是云部署场景。我们在生产实践中都会做瘦身的操作&#xff0c;尽最大的可能使用 Size 小的镜像完成功能。下文是一个简单的 ReactJS 程序上线的瘦身体验&#xff0c;希望可以帮助大家找到镜像瘦身的方向和灵感。 …

Helm之深入浅出Kubernetes包管理工具使用

Chart 使用 作者:行癫(盗版必究) 一:Chart 模板使用 1.创建chart ​ templates目录包括了模板文件;当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates目录中;然后收集模板的结果并发送给Kubernetes ​ values.yaml 文件也导入到了模板;这个文件包含了c…

北京大学2016计算机学科夏令营上机考试

目录 A:分段函数【水题】 B:单词翻转【暴力不水】 C:反反复复【字符串】 D:文件结构“图”【图】 E:Exchange Rates【这不是我能做的】 F:Dungeon Master【没看懂题目什么意思】 G:重建二叉树【树】 A:分段函数【水题】 #include<iostream> using namespace std;…

如何自学入门网络安全/黑客?【建议收藏】

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

零基础学会Python编程——不同的运算:算术、关系与逻辑(1)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 学习目标 一. 运算 1.算术运算 2.加法运算 3.减法运算 4.乘法运算 5.除法…

Redis从入门到精通【进阶篇】之消息传递发布订阅模式详解

文章目录 0. 前言1. 基本原理1.1 基于频道(Channel)的发布/订阅1.2 基于模式(Pattern)的发布/订阅 2. Redis 发布订阅实际应用2.1 Redis Sentinel2.1 SpringBoot Redis发布/订阅 3. Redis从入门到精通系列文章 0. 前言 发布订阅模式&#xff08;Publish-Subscribe Pattern&…

小而强大:通过容器化应用实现前端微服务

微服务架构是一种软件架构模式&#xff0c;用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务&#xff0c;并且…

Distractor-aware Siamese Networks for Visual Object Tracking(DaSiamRPN)

Distractor-aware Siamese Networks for Visual Object Tracking&#xff08;DaSiamRPN&#xff0c;ECCV2018&#xff09; 该论文针对以下三个问题&#xff0c;分别进行了改进&#xff1a; 常见的Siam类跟踪方法只能区分目标和无语义信息的背景&#xff08;即简单背景&#x…