簡體   English   中英

退出后從C ++程序永久設置環境變量

[英]Permanently setting environment variables from a C++ program after exit

我正在編寫一個多次運行C ++程序的bash腳本。 我使用getenv()putenv()在C ++程序中創建,獲取和更新環境變量。 在C ++程序結束后,bash腳本需要獲取這些變量並執行一些基本邏輯。 問題是當C ++程序退出時,環境變量就會消失。 有沒有辦法在程序終止后永久存儲這些變量,以便bash腳本可以使用它們? 如果沒有,在bash腳本和C ++程序之間共享變量的最佳方法是什么? 我能想到的唯一解決方案是將輸出寫入文件。 我不想在控制台中打印這些數據。 任何幫助將不勝感激。

每個進程都有自己的環境變量副本,這些副本在啟動新進程時通過從父進程復制它們來初始化。 在流程中更改環境變量時,父流程不知道這一點。

為了將信息從孩子傳回父母,您需要設置其他類型的溝通渠道。 它可能是磁盤上的文件,也可能是管道,或者(取決於父級的功能, bash可能無法完成所有這些)共享內存或其他一些IPC機制。 然后,父程序將負責根據從子女收到的信息更改自己的環境變量。

我個人只能在16位DOS匯編程序中執行此操作,通過跟蹤指向前一個進程的指針直到它指向自身,這意味着您已到達COMMAND.COM的第一個實例,然后更改了它手動環境。

如果你的程序通過標准輸出將變量作為字符串返回,如下所示:

FOO=23; BAR=45;

然后,bash可以像這樣調用它:

eval `./your_program`

結束$ FOO和$ BAR將可以訪問bash。

要測試此嘗試:

eval `echo "FOO=23; BAR=45;"`
echo "$FOO $BAR"

當然,在這個方法中,程序不會改變調用進程的環境變量(這是不可能的),而只是返回一個字符串,然后由bash評估並且評估設置變量。

如果您的程序處理來自不受信任來源的輸入,請不要使用此方法。 如果有人欺騙你的程序將“rm -rf /”打印到標准輸出,那么你將注定失敗。

據我所知,在“標准”GNU / Linux環境下,您可以通過3種方式設置環境變量:

  • 使用命令行實用程序,如export
  • 為用戶編輯~/.profile~/.bashrc等文件或在/etc為系統編輯等效文件
  • 將臨時值提供給命令,如CXX=g++ CUSTOM_VERSION=2.5 command

最后一個通常用於自定義構建,它很好,因為它不會損害系統並且不會干擾任何系統設置或值或文件,並且在執行命令后一切都恢復正常 如果您希望對特定變量集進行臨時修改,這是最好的方法。

程序無法在其父級中設置環境變量。 或者,嗯,沒有合法的方式。 使用ptrace其進程並不重要。 :-)

您應該做的是在標准輸出上輸出環境變量。 讓shell腳本讀取並設置它們。 如果環境變量都是您輸出的,則調用非常簡單:

`program`

反向標記將捕獲程序的輸出。 然后它將用輸出替換后面的滴答。 這將是設置shell變量的命令。 然后在shell腳本中確保執行以下操作:

export VAR1
export VAR2

您需要導出命令才能將它們移動到傳遞給從shell啟動的程序的環境中。

您無法設置在過程的生命周期中存活的環境變量,因此最簡單的解決方案是按照您的建議寫入輸出文件或寫入從Bash傳遞的特定文件句柄:

C ++:

int main (int argc, char* argv[])
{
   // missing error handling
   int fd = atoi(argv[1]);
   const char* env = "BLAH=SMURF";
   write(5, env, strlen(env));
   return 0;
}

擊:

# discard stdout and stderr, redirect 5 to stdout so that it can be captured
# and tell the process that it should write to 5 (the first 5)
VARIABLES=`./command 5 2>&1 1>/dev/null 5>&1`

這可能是一個破解鍋的想法,但它應該工作:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM