嵌入式Linux系統編程 — 7.2 進程的環境變量

目錄

1 什么是進程的環境變量

2 環境變量的作用

3?應用程序中獲取環境變量

3.1?environ全局變量

3.2?獲取指定環境變量 getenv

4?添加/刪除/修改環境變量

4.1?putenv()函數添加環境變量

4.2?setenv()函數

4.3?unsetenv()函數


1 什么是進程的環境變量

每一個進程都有一組與其相關的環境變量, 這些環境變量以字符串形式存儲在一個字符串數組列表中,把這個數組稱為環境列表。 其中每個字符串都是以“名稱=值(name=value)” 形式定義,所以環境變量是“名稱-值”的成對集合。

譬如在 shell 終端下可以使用 env 命令查看到 shell 進程的所有環境變量,如下所示:

使用 export 命令還可以添加一個新的環境變量或刪除一個環境變量:

export LINUX_TEST=123456 # 添加 LINUX_TEST 環境變量

使用"export -n LINUX_TEST"命令則可以刪除 LINUX_TEST 環境變量。

2 環境變量的作用

環境變量主要有以下幾個作用:

  • 配置應用程序:環境變量可以用于存儲應用程序的配置信息,如文件路徑、配置選項等。這使得應用程序可以在不同的環境中使用相同的代碼,但根據環境變量的不同而表現出不同的行為。

  • 傳遞信息:在進程創建時,父進程的環境變量可以傳遞給子進程。這允許在不同程序之間共享信息,例如,用戶的家目錄路徑通常通過環境變量 HOME 傳遞。

  • 控制shell行為:在shell中,環境變量控制著許多行為,如提示符的格式、別名、shell腳本的搜索路徑等。

3?應用程序中獲取環境變量

3.1?environ全局變量

應用程序當中也可以獲取當前進程的環境變量,事實上,進程的環境變量是從其父進程中繼承過來的,譬如在 shell 終端下執行一個應用程序,那么該進程的環境變量就是從其父進程(shell 進程)中繼承過來的。新的進程在創建之前,會繼承其父進程的環境變量副本。

環境變量存放在一個字符串數組中,在應用程序中,通過 environ 變量指向它, environ 是一個全局變量,在我們的應用程序中只需申明它即可使用,如下所示:

extern char **environ; // 申明外部全局變量 environ

編寫應用程序,獲取進程的所有環境變量。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>extern char **environ;int main() 
{// 遍歷環境變量數組while (*environ != NULL) {printf("%s\n", *environ);environ++;}return 0;
}

運行結果如下,可以看到和‘evn’命令行有相同的結果。

3.2?獲取指定環境變量 getenv

如果只想要獲取某個指定的環境變量,可以使用庫函數 getenv(),其函數原型如下所示:

#include <stdlib.h>char *getenv(const char *name);
  • name: 指定獲取的環境變量名稱。
  • 返回值: 如果存放該環境變量,則返回該環境變量的值對應字符串的指針;如果不存在該環境變量,則返回 NULL。

下面是一個使用 getenv() 函數獲取這個環境變量的值的示例程序:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) 
{// 檢查是否提供了環境變量名稱作為命令行參數if (argc != 2) {printf("Usage: %s <environment-variable-name>\n", argv[0]);return 1;}// 獲取環境變量的值const char *value = getenv(argv[1]);if (value != NULL) {printf("The value of '%s' is: %s\n", argv[1], value);} else {printf("The environment variable '%s' is not set.\n", argv[1]);}return 0;
}

?通過程序查看SHELL環境變量的值,

4?添加/刪除/修改環境變量

C 語言函數庫中提供了用于修改、添加、刪除環境變量的函數,譬如 putenv()、 setenv()、 unsetenv()、clearenv()函數等。

4.1?putenv()函數添加環境變量

putenv() 函數用于添加或修改環境變量的函數。它接收一個字符串參數,該字符串應該包含環境變量的名稱和值,兩者之間用等號(=)連接。如果環境變量已經存在,putenv() 會更新它的值;如果不存在,它將添加一個新的環境變量。其函數原型如下所示:

#include <stdlib.h>int putenv(char *string);
  • string: 參數 string 是一個字符串指針,指向 name=value 形式的字符串。
  • 返回值: 成功返回 0;失敗將返回非 0 值,并設置 errno。

使用 putenv()函數為當前進程添加一個環境變量。

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{if (2 > argc) {fprintf(stderr, "Error: 傳入 name=value\n");exit(-1);}/* 添加/修改環境變量 */if (putenv(argv[1])) {perror("putenv error");exit(-1);}exit(0);
}

運行結果如下:

4.2?setenv()函數

setenv()函數可以替代 putenv()函數,用于向進程的環境變量列表中添加一個新的環境變量或修改現有環境變量對應的值,其函數原型如下所示:

#include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);
  • name: 需要添加或修改的環境變量名稱。
  • value: 環境變量的值。
  • overwrite: 若參數 name 標識的環境變量已經存在,在參數 overwrite 為 0 的情況下, setenv()函數將不改變現有環境變量的值,也就是說本次調用沒有產生任何影響;如果參數 overwrite 的值為非 0,若參數 name標識的環境變量已經存在,則覆蓋,不存在則表示添加新的環境變量。
  • 返回值: 成功返回 0;失敗將返回-1,并設置 errno。

setenv()與 putenv()函數有兩個區別:

  • putenv()函數并不會為 name=value 字符串分配內存;
  • setenv()可通過參數overwrite控制是否需要修改現有變量的值而僅以添加變量為目的,顯然putenv()并不能進行控制。

setenv()函數使用示例程序如下:

#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[]) 
{// 檢查是否提供了環境變量名稱和值if (argc != 3) {printf("Usage: %s <variable-name> <value>\n", argv[0]);return 1;}// 使用 setenv 函數添加或修改環境變量// setenv 返回 0 表示成功,非 0 表示錯誤if (setenv(argv[1], argv[2], 1) != 0) {perror("Failed to set environment variable");return 1;}// 打印環境變量的值以驗證const char *value = getenv(argv[1]);if (value != NULL) {printf("%s is now set to: %s\n", argv[1], value);} else {printf("Failed to retrieve the set environment variable.\n");}return 0;
}

程序首先檢查是否提供了正確的參數數量。如接下來,程序使用 setenv() 函數來設置環境變量。setenv() 的第三個參數設置為 1,表示如果環境變量已經存在,允許覆蓋它的值。然后,程序使用 getenv() 函數來驗證環境變量是否已正確設置,并打印出它的值。運行結果如下:

4.3?unsetenv()函數

unsetenv() 是 POSIX 標準中定義的一個函數,用于從當前進程的環境中刪除指定的環境變量。這個函數的原型通常如下:

#include <stdlib.h>int unsetenv(const char *name);
  • name :要刪除的環境變量的名稱。
  • 返回值:如果環境變量成功被刪除,unsetenv() 會返回 0;如果發生錯誤,比如嘗試刪除不存在的變量,會返回非零值。

下面是一個使用 unsetenv() 函數的示例程序,它接受一個命令行參數(環境變量的名稱),并嘗試從當前進程的環境中刪除這個變量:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char *argv[]) 
{// 檢查是否提供了環境變量名稱if (argc != 2) {printf("Usage: %s <environment-variable-name>\n", argv[0]);return 1;}// 嘗試刪除環境變量if (unsetenv(argv[1]) == -1) {perror("Failed to unset environment variable");return 1;}// 驗證環境變量是否被刪除const char *value = getenv(argv[1]);if (value == NULL) {printf("The environment variable '%s' has been unset.\n", argv[1]);} else {printf("The environment variable '%s' is still set to: %s\n", argv[1], value);}return 0;
}

運行結果如下:?



?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42152.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android觸摸事件分發關鍵點【筆記摘要】

觸摸事件分發&#xff1a;就是一個為了解決觸摸事件沖突而設置的機制 1.事件類型 ACTION_DOWN -> ACTION_UP / ACTION_CANCEL ACTION_DOWN -> ACTION_MOVE -> ACTION_MOVE -> ACTION_MOVE -> ACTION_UP / ACTION_CANCEL 這個取消事件ACTION_CANCEL它是一種特殊…

Hack The Box -- Blazorized

一、準備工作 端口掃描 詳細掃描 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-06-30 21:39 EDT Nmap scan report for 10.10.11.22 Host is up (0.26s latency).PORT STATE SERVICE VERSION 53/tcp open domain Simple DNS Plus 80/tcp op…

Java后端開發(十三)-- Java8 stream的 orElse(null) 和 orElseGet(null)

orElse(null)表示如果一個都沒找到返回null。【orElse()中可以塞默認值。如果找不到就會返回orElse中你自己設置的默認值。】 orElseGet(null)表示如果一個都沒找到返回null。【orElseGet()中可以塞默認值。如果找不到就會返回orElseGet中你自己設置的默認值。】 區別就…

MyBatisPlus Service接口的繼承

介紹 Service接口 接口基礎了接口 IService&#xff0c;實現類實現就需要實現IService里的方法&#xff0c;但是MyBatisplus已經幫我們寫好了實現類&#xff0c;給我們的實現類繼承即可。 public interface IEmpService extends IService<Emp> { //其他業務方法.... }…

web學習筆記(八十)

目錄 1.小程序實現微信一鍵登錄 2. 小程序的授權流程 3.小程序配置vant庫 4.小程序配置分包 5.小程序配置獨立分包 6.小程序分包預下載 1.小程序實現微信一鍵登錄 要先實現小程序一鍵登錄首先我們需要給按鈕設置一個綁定事件&#xff0c;然后在綁定事件內部通過wx.login…

產品經理-工作流程及職能(6)

產品經理作為互聯網項目的主心骨&#xff0c;連接著團隊的所有成員&#xff08;開發、設計、運營、測試、市場等&#xff09; 用合理的產品規劃和清晰的產品愿景帶領大家前進&#xff0c;通過滿足用戶需求來創造屬于自己的商業利益。 在通常情況下&#xff0c;PM需要對整個產品…

大數據前沿技術分享——數據編織:現代數據管理的革命性方法

一、什么是數據編織&#xff1f; 數據編織&#xff08;Data Fabric&#xff09;是一種現代數據管理架構&#xff0c;旨在通過集成、管理和提供數據訪問來簡化復雜的數據環境。它利用自動化和智能技術&#xff0c;如機器學習和人工智能&#xff0c;來實現數據的無縫連接和統一視…

Yarn: 現代化的JavaScript包管理器

在JavaScript開發的世界里&#xff0c;包管理器是開發者不可或缺的工具。Yarn&#xff0c;由Facebook創建&#xff0c;是一個快速、可靠且安全的依賴管理工具&#xff0c;它為JavaScript應用程序提供了一個更高效的方式來處理包的安裝、更新和版本控制。本文將介紹Yarn的基本用…

刷題Day44|188.買賣股票的最佳時機IV、309.最佳買賣股票時機含冷凍期、714.買賣股票的最佳時機含手續費

188.買賣股票的最佳時機IV 188. 買賣股票的最佳時機 IV - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;最多買賣k次&#xff0c;每次都有持有和不持有&#xff0c;所以下標最大到dp[i][2k]。 309.最佳買賣股票時機含冷凍期 309. 買賣股票的最佳時機含冷凍期 - 力…

百度智能云創新業務部總經理李想:發揮AI企業科技創新優勢 助力職業教育人才揚帆遠航

前言&#xff1a;百度智能云教育行業解決方案作為百度智能云旗下的創新力量&#xff0c;專注于培養“AI教育”領域的新質生產力人才&#xff0c;一直以來備受職業教育領域的關注。在第六屆人工智能“職教百強”院校長論壇開幕之際&#xff0c;中教全媒體對話論壇嘉賓百度智能云…

最新扣子(Coze)實戰案例:使用圖像流做超分,模糊圖片秒變清晰,完全免費教程

&#x1f9d9;?♂? 大家好&#xff0c;我是斜杠君&#xff0c;手把手教你搭建扣子AI應用。 &#x1f4dc; 本教程是《AI應用開發系列教程之扣子(Coze)實戰教程》&#xff0c;完全免費學習。 &#x1f440; 關注斜杠君&#xff0c;可獲取完整版教程。&#x1f44d;&#x1f3f…

當需要對大量數據進行排序操作時,怎樣優化內存使用和性能?

文章目錄 一、選擇合適的排序算法1. 快速排序2. 歸并排序3. 堆排序 二、數據結構優化1. 使用索引2. 壓縮數據3. 分塊排序 三、外部排序1. 多路歸并排序 四、利用多核和并行計算1. 多線程排序2. 使用并行流 五、性能調優技巧1. 避免不必要的內存復制2. 緩存友好性3. 基準測試和性…

區塊鏈技術如何改變供應鏈管理?

引言 供應鏈管理在現代商業中扮演著至關重要的角色&#xff0c;確保產品和服務從原材料到最終消費者的順利流轉。然而&#xff0c;當前的供應鏈管理面臨諸多挑戰&#xff0c;如信息不透明、數據篡改和效率低下等問題&#xff0c;這些問題嚴重制約了供應鏈的整體效能和可信度&am…

多模態圖像引導手術導航進展

**摘要&#xff1a;**對多模態圖像分割建模、手術方案決策、手術空間位姿標定與跟蹤、多模態圖像配準、圖像融合與顯示等多模態圖像引導手術導航的關鍵技術進行總結和分析&#xff0c;提出其進一步發展面臨的挑戰并展望其未來發展趨勢。 **外科手術的發展歷程&#xff1a;**從最…

簡單分享下python多態

目錄&#xff1a; 一、多態是啥嘞&#xff08;龍生九子各有不同&#xff0c;這就是多態&#xff09; 二、基礎的實例 三、多態的優勢與應用場景 四、深入理解 一、多態是啥嘞&#xff08;龍生九子各有不同&#xff0c;這就是多態&#xff09; 多態&#xff08;Polymorphism&…

ffmpeg 獲取視頻時長的命令及其輸出

要獲取視頻的時長&#xff0c;可以使用FFmpeg的-i參數&#xff0c;后跟視頻文件的路徑。下面是獲取視頻時長的命令示例&#xff1a; ffmpeg -i input.mp4輸出示例&#xff1a; Input #0, mov,mp4,m4a,3gp,3g2,mj2, from input.mp4:Metadata:major_brand : mp42minor_vers…

筆記14:程序中的循環結構

生活中的循環現象&#xff1a; -日復一日&#xff0c;年復一年 -春夏秋冬&#xff0c;四季交替 -周日&#xff0c;周一&#xff0c;周二&#xff0c;周三&#xff0c;周四&#xff0c;周五&#xff0c;周六 -人生是一個輪回&#xff0c;多年后&#xff0c;又會回到最初的原點 …

C++|哈希應用->布隆過濾器

目錄 一、概念 二、模擬實現 三、布隆過濾器擴展應用 上一篇章學習了位圖的使用&#xff0c;但它只適用于整數&#xff0c;對于要查詢字符串是否在不在&#xff0c;位圖并不能解決。所以針對這一問題&#xff0c;布隆過濾器可以派上用場&#xff0c;至于布隆過濾器是什么&am…

全球首款商用,AI為視頻自動配音配樂產品上線

近日&#xff0c;海外推出了一款名為Resona V2A的產品&#xff0c;這是全球首款商用視頻轉音頻 (V2A) 技術產品。這項突破性技術利用AI&#xff0c;僅憑視頻數據即可自動生成高質量、與上下文相關的音頻&#xff0c;包括聲音設計、音效、擬音和環境音&#xff0c;為電影制作人、…

linux內核開發之tftp服務搭建

TFTP (Trivial File Transfer Protocol) 是一個簡單的文件傳輸協議&#xff0c;通常用于在計算機網絡中進行文件傳輸。它是FTP的一個簡化版本&#xff0c;主要用于在局域網內部傳輸文件。 主要特點和用途&#xff1a; 簡單性&#xff1a; TFTP設計簡單&#xff0c;功能有限&am…