實操(環境變量)Linux

環境變量概念

我們用語言寫的文件編好后變成了程序,./ 運行的時候他就會變成一個進程被操作系統調度并運行,運行完畢進程相關資源被釋放,因為它是一個bash的子進程,所以它退出之后進入僵尸狀態,bash回收他的退出結果,我們就能夠得到他的退出結果,這是我們之前說的,現在的問題是我寫的可執行程序和系統自帶的指令有什么區別呢?答案是沒有任何區別,只不過人家寫的軟件被納入到Linux基本指令的范疇,你寫的只能你自己玩,本質上都叫做可執行程序,為什么運行我自己寫的程序必須要帶 ./ 呢,如果想讓我的程序不帶 ./ 該怎么解決呢?

這里就可以找到比較好的切入點,. 就是當前路徑,/ 是路徑分隔符,所以 ./myproc 是我們在用相對路徑的方式來定位可執行程序,換句話說,如果你愿意,你也可以從根目錄開始,/home/cyx/day12/myproc,用絕對路徑的方式訪問自己的程序

ls可以不帶 ./ 就能運行的原因在于,默認的程序在系統當中,會存在一個環境變量,它能夠幫我們通過該變量在系統中特定的路徑下幫我們搜索對應的ls命令,執行一條命令的前提,一定是要先找到他,找不到還執行啥呢?系統中存在的環境變量叫做PATH,讀取環境變量的內容(echo $PATH)

綜合剛剛所說為什么執行pwd、ls這些命令可以不帶路徑,原因是因為它們在特定的環境變量所指明的若干路徑當中,Shell會從PATH環境變量(一串用冒號分隔的目錄路徑)中從左到右依次搜索這些目錄,尋找與命令名稱匹配的可執行文件,找到就自動執行了,不用帶路徑,而我們自己寫的可執行程序對應的路徑是自己的路徑,沒有在環境變量里,所以執行時無法直接找到我們的可執行程序,必須要用戶指明出他對應的路徑

上圖可以證明,(which ls)可以看到他在環境變量/usr/bin/路徑下,他就不用帶 ./ 運行了,換言之,我們想不用帶 ./ 就能運行也可以實現,在PATH環境變量所支持的眾多:分隔的一個個路徑當中,把你的路徑追加到后面(export PATH=$PATH:/home/cyx/day12)

  • 注意可能會寫出這樣的命令(export PATH=/home/cyx/day12),?這種方式是不對的,不是把PATH是整體全部換成自己的路徑,這樣會把把別人的路徑全部覆蓋,如果你不小心誤操作了環境變量,不用擔心,將xshell全部關閉,重新再登錄就可以了

還有另一種方式,把可執行程序拷貝到/usr/bin路徑下(sudo cp -rf myproc /usr/bin)

  • 在Linux中,把可執行程序,拷貝到系統默認路徑下,這種讓我們可以直接訪問的方式,相當于Linux下軟件的安裝:你們用windows當中的工具幫你們安裝軟件,本質是把可執行程序、配置文件,全部拷貝到你系統特定的某些路徑下,比如C盤的Profile,這個動作就叫做安裝,不想要了可以刪掉(sudo rm /usr/bin/myproc -rf)

  • 刪掉的動作其實就是某種意義上的卸載

?環境變量相關函數

1. exec 函數族

  • 這些函數用于替換當前進程的映像為新的程序。如果執行成功,原程序的代碼、數據、堆棧等會被新程序覆蓋,但進程ID不變
#include <unistd.h>extern char **environ;  全局變量,指向當前進程的環境變量數組(格式為?KEY=VALUE)
示例:for (char **env = environ; *env; env++) {printf("%s\n", *env);}int execl(const char *pathname, const char *arg, .../* (char  *) NULL */);
int execlp(const char *file, const char *arg, .../* (char  *) NULL */);
int execle(const char *pathname, const char *arg, .../*, (char *) NULL, char *const envp[] */);
int execv(const char *pathname, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • 命名規則

    • 后綴?l:參數通過可變參數列表傳遞,參數列表以NULL結尾
    • 后綴?v:參數通過數組傳遞,數組元素以?NULL?結尾
    • 后綴?p:在?PATH?中搜索可執行文件
    • 后綴?e:允許自定義環境變量(通過?envp?參數)
  • 錯誤處理:所有?exec?函數失敗時會返回?-1,需檢查?errno
  • 環境變量execle?和?execvpe?可以覆蓋默認環境變量,其他函數繼承調用進程的環境

2?getenv

  • 功能:獲取指定環境變量的值。

#include <stdlib.h>char *getenv(const char *name);參數:name:環境變量名返回值:成功返回變量值(字符串),失敗返回?NULL示例:char *path = getenv("PATH");

3 putenv

  • 功能:設置或修改環境變量(格式為?KEY=VALUE
#include <stdlib.h>int putenv(char *string);參數:string:環境變量字符串(如?"PATH=/usr/bin")返回值:成功返回?0,失敗返回非?0注意:修改會影響當前進程及其子進程示例:putenv("MY_VAR=123");

實操

makefile

myproc:proc.cgcc -o $@ $^
.PHONY:clean
clean:rm -f myproc

exec/otherproc.cc

#include <iostream>
#include <unistd.h>using namespace std;int main()
{for(int i = 0; i < 5; i++){cout << "-------------------------------------------------------------------------"<< endl;cout << "我是另一個程序,我的pid是: " << getpid() << endl;cout << " MYENV: " << (getenv("MYENV")==NULL?"NULL":getenv("MYENV")) << endl;cout << " PATH: " << (getenv("PATH")==NULL?"NULL":getenv("PATH")) << endl;cout << "-------------------------------------------------------------------------"<< endl;sleep(1);}return 0;
}

proc.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>int main()
{extern char **environ;pid_t id = fork();if(id == 0){//childprintf("我是子進程: %d\n", getpid());//execl: 如果替換成功,不會有返回值,如果替換失敗,一定有返回值 ==》如果失敗了,必定返回 ==》 只要有返回值,就失敗了//不用對該函數進行返回值判斷,只要繼續向后運行一定是失敗的!//execl("/bin/ls", "ls", "-a", "-ln", NULL); //lsssss: 不存在//char *const myargv[] = {//    "ls",//    "-a",//    "-l",//    "-n",//    NULL//};//execv("/bin/ls", myargv); //lsssss: 不存在//execlp("ls", "ls", "-a", "-l", "-n", NULL);//execvp("ls", myargv);//char *const myenv[] = {//    "MYENV=YouCanSeeMe",//    NULL//};putenv("MYENV=YouCanSeeMe");//覆蓋式寫入,只執行我們定義的環境變量,系統環境變量就失效了,可以傳environ全局環境變量數組execle("./exec/otherproc", "otherproc", NULL, environ); exit(1);}sleep(1);//fatherint status = 0;printf("我是父進程: %d\n", getpid());waitpid(id, &status, 0);printf("child exit code: %d\n", WEXITSTATUS(status));return 0;
}

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

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

相關文章

torch.cat和torch.stack的區別

torch.cat 和 torch.stack 是 PyTorch 中用于組合張量的兩個常用函數&#xff0c;它們的核心區別在于輸入張量的維度和輸出張量的維度變化。以下是詳細對比&#xff1a; 1. torch.cat (Concatenate) 作用&#xff1a;沿現有維度拼接多個張量&#xff0c;不創建新維度 輸入要求…

深入解析@Validated注解:Spring 驗證機制的核心工具

一、注解出處與核心定位 1. 注解來源 ? 所屬框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 ? 核心定位&#xff1a; 作為 Spring 對 JSR-380&#xff08;Bean Validation 2.0&#…

2025年認證杯數學建模競賽A題完整分析論文(含模型、可運行代碼)(共32頁)

2025年認證杯數學建模競賽A題完整分析論文 目錄 摘要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1解析 4.1.2問題1模型建立 4.1.3問題1樣例代碼&#xff08;僅供參考&#xff09; 4.1.4問題1求解結果分析&#xff08…

Google A2A協議,是為了戰略性占領標準?

一、導讀 2025 年 4 月 9 日&#xff0c;Google 正式發布了 Agent2Agent&#xff08;A2A&#xff09;協議。 A2A 協議致力于打破智能體之間的隔閡&#xff0c;讓它們能夠跨越框架和供應商的限制&#xff0c;以一種標準化、開放的方式進行溝通與協作 截止到現在&#xff0c;代…

Ansible:roles角色

文章目錄 Roles角色Ansible Roles目錄編排Roles各目錄作用創建 roleplaybook調用角色調用角色方法1&#xff1a;調用角色方法2&#xff1a;調用角色方法3&#xff1a; roles 中 tags 使用實戰案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于層次性、結構化…

MCU的USB接口作為 USB CDC串口輸出

引用&#xff1a; https://microchip-mplab-harmony.github.io/usb_apps_device/apps/usb_uart_bridge_dual/readme.html STM32 USB使用記錄&#xff1a;使用CDC類虛擬串口&#xff08;VCP&#xff09;進行通訊_stm32 usb使用記錄:使用cdc類虛擬串口(vcp)進行通訊-CSDN博客 前…

深度解析強化學習:原理、算法與實戰

深度解析強化學習:原理、算法與實戰 0. 前言1. 強化學習基礎1.1 基本概念1.2 馬爾科夫決策過程1.3 目標函數1.4 智能體學習過程2. 計算狀態值3. 計算狀態-動作值4. Q 學習4.1 Q 值4.2 使用 Q 學習進行 frozen lake 游戲4.3. frozen lake 問題4.4 實現 Q 學習小結系列鏈接0. 前…

UE5藍圖之間的通信------接口

一、創建藍圖接口 二、雙擊創建的藍圖接口&#xff0c;添加函數&#xff0c;并重命名新函數。 三、在一個藍圖&#xff08;如玩家角色藍圖&#xff09;中實現接口&#xff0c;如下圖&#xff1a; 步驟一&#xff1a;點擊類設置 步驟二&#xff1a;在細節面板已經實現的接口中…

2025 年“認證杯”數學中國數學建模網絡挑戰賽 A題 小行星軌跡預測

近地小行星&#xff08; Near Earth Asteroids, NEAs &#xff09;是軌道相對接近地球的小行 星&#xff0c;它的正式定義為橢圓軌道的近日距不大于 1.3 天文單位&#xff08; AU &#xff09;的小行星。 其中軌道與地球軌道最近距離小于 0.05A 且直徑大于 140 米的小行星被…

Axure中繼器(Repeater): 列表多選和 列表查詢

文章目錄 引言I 列表多選添加選中交互事件添加未選中交互事件II 列表查詢知識點操作說明引言 基于鼠標點擊交互事件實現列表多選列表查詢 I 列表多選 添加選中交互事件 給列標題第一列多選框元件命名為ckeck,并同時添加選中交互事件; 同步添加設置選擇/選中動作,目標元件選…

windows11下pytorch(cpu)安裝

先裝anaconda 見最下方 Pytorch 官網&#xff1a;PyTorch 找到下圖&#xff08;不要求版本一樣&#xff09;&#xff08;我的電腦是集顯&#xff08;有navdia的裝gpu&#xff09;&#xff0c;裝cpu&#xff09; 查看已有環境列表 創建環境 conda create –n 虛擬環境名字(…

最新版IDEA超詳細圖文安裝教程(適用Mac系統)附安裝包及補丁2025最新教程

目錄 前言 一、IDEA最新版下載 二、IDEA安裝 三、IDEA補丁 前言 IDEA&#xff08;IntelliJ IDEA&#xff09;是專為Java語言設計的集成開發環境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司開發&#xff0c;被公認為業界最優秀的Java開發工具之一。DEA全稱Int…

react從零開始的基礎課1

全文約5萬字。 1.hello,.. // App.jsx import { useState } from react import reactLogo from ./assets/react.svg import viteLogo from /vite.svg import ./App.cssfunction App() {const [count, setCount] useState(0)return (<><Greeting name"world&qu…

【linux知識】web服務環境搭建(一):用戶以及開發環境初始化

toc 創建用戶組以及用戶 以下是 創建用戶組 wendao 和用戶 wendao 并指定 GID、UID 及家目錄 的完整操作指南&#xff1a; 一、創建用戶組&#xff08;指定 GID&#xff09; sudo groupadd -g 1500 wendao # 創建組并指定 GID 為 1500? 注意&#xff1a;GID 需唯一&#…

音視頻 五 看書的筆記 MediaCodec

MediaCodec 用于訪問底層媒體編解碼器框架&#xff0c;編解碼組件。通常與MediaExtractor(解封裝,例如Mp4文件分解成 video和audio)、MediaSync、MediaMuxer(封裝 例如音視頻合成Mp4文件)、MediaCrypto、Image(cameraX 回調的ImageReader對象可以獲取到Image幀圖像,可轉換成YU…

李宏毅NLP-3-語音識別part2-LAS

語音識別part2——LAS Listen Listen主要功能是提取內容信息&#xff0c;去除說話人差異和噪聲 。編碼器&#xff08;Encoder&#xff09;結構&#xff0c;輸入是聲學特征&#xff0c;經過 Encoder 處理后&#xff0c;輸出為高級表示&#xff0c;這些高級表示可用于后續語音識別…

開源CMS的模塊化設計和API接口如何具體影響其擴展性?

優秀的CMS系統都有自己主打的特點&#xff0c;開源CMS憑借其靈活性和低成本優勢占據了市場主流地位&#xff0c;而模塊化設計與API接口正是其擴展性的兩大基石。本文將深入探討這兩大技術特性是如何影響cms的擴展性的。 一、模塊化設計&#xff1a;功能解耦與生態繁榮的引擎 …

一文讀懂WPF系列之常用控件以及樣式

WPF控件 控件分類概覽常用控件常用控件代碼示例和效果 樣式與模板應用樣式定義??方式行內樣式??頁面/窗口級資源樣式&#xff08;Local Resource&#xff09;應用程序全局資源獨立資源字典&#xff08;ResourceDictionary&#xff09;控件模板&#xff08;ControlTemplate&…

AndroidTV D貝桌面-v3.2.5-[支持文件傳輸]

AndroidTV D貝桌面 鏈接&#xff1a;https://pan.xunlei.com/s/VONXSBtgn8S_BsZxzjH_mHlAA1?pwdzet2# AndroidTV D貝桌面-v3.2.5[支持文件傳輸] 第一次使用的話&#xff0c;壁紙默認去掉的&#xff0c;不需要按遙控器上鍵&#xff0c;自己更換壁紙即可

XDocument和XmlDocument的區別及用法

因為這幾天用到了不熟悉的xml統計數據&#xff0c;啃了網上的資料解決了問題&#xff0c;故總結下xml知識。 1.什么是XML?2.XDocument和XmlDocument的區別3.XDocument示例1示例2&#xff1a;示例3&#xff1a; 4.XmlDocument5.LINQ to XML6.XML序列化(Serialize)與反序列化(De…