簡體   English   中英

在Linux中為正在運行的程序設置環境變量

[英]Setting environment variable for a running program in linux

我的程序使用環境變量DBG_MSG值來確定調試消息的級別。 DBG_MSG=3打印最大調試信息。

但是,只要程序以一種奇怪的意外方式運行,就不會將環境變量設置為打印完整的調試信息。 當程序在環境設置下重新運行時,不會顯示相同的錯誤。

我正在考慮使用putenv(3)SIGUSR1實現信號處理程序以在運行時設置此環境變量。 這樣,我可以將信號發送到掛起的作業,以使其打印更多的調試信息。

這樣做時要采取哪些安全措施?

還有其他方法可以從外部更改正在運行的程序的環境嗎?

putenv不是異步信號安全的 ,因此永遠不要SIGUSR1處理程序中調用它。 此外,通過所做的更改putenv不一定被注意到getenv在另一個線程調用。

相反,您應該做的是在啟動時僅讀取一次DBG_MSG環境變量,並將該值存儲在類型為volatile sig_atomic_t的全局變量中。 您的調試日志記錄例程應查看此變量,以決定要打印多少信息。 然后,讓信號處理程序調整變量的值。

我也建議SIGUSR1遞增變量,而SIGUSR2 遞減變量。 這樣,您可以根據需要提高和降低日志級別。

sig_atomic_t可能非常小,並且不能保證是帶符號的或無符號的:可移植程序只能使用它來存儲0到127(含)范圍內的值。 因此,請確保信號處理程序將值限制在對程序有意義的范圍內(即,不要將日志級別增加到超過最大值或將日志級別減少到超過最小值)。

安全措施是:請勿這樣做。

putenv(3)不是異步信號安全的(主要是因為它可以調用malloc(3) ),因此您不應真正從信號處理程序中調用它。

您需要確保您不會在程序中遇到env變量。 Env變量應該在您的shell中設置一次,並且不要理會。 畢竟它們是環境變量。 他們只是為您的程序設置或定義環境。

還有另一種方法..您也可以實現ioctl調用。

甚至很多司機都在做同樣的事情..

暫無
暫無

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

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