为 linux 中的 运行 程序设置环境变量

Setting environment variable for a running program in linux

我的程序使用环境变量 DBG_MSG 值来确定调试消息的级别。 DBG_MSG=3 打印最大调试信息。

然而,每当程序以一种奇怪的、意想不到的方式运行时,环境变量就没有设置为打印完整的调试信息。当程序在环境设置下重新运行时,它不会显示相同的错误。

我正在考虑为 SIGUSR1 实现一个信号处理程序,以便在运行时使用 putenv(3) 设置此环境变量。这样我就可以将信号发送到挂起的作业,使其打印更多调试信息。

执行此操作时应采取哪些安全措施?

是否有任何其他方法可以从外部更改 运行 程序的环境?

安全措施是:不要这样做。

putenv(3) 不是异步信号安全的(主要是因为它可以调用 malloc(3)),所以你真的不应该从信号处理程序中调用它。

putenv 不是 async-signal-safe,因此不应从 SIGUSR1 处理程序调用 。此外,putenv 所做的更改不一定会被另一个线程中的 getenv 调用注意到。

您应该做的是在启动时仅读取一次 DBG_MSG 环境变量,并将值存储在类型为 volatile sig_atomic_t 的全局变量中。您的调试记录例程应该查看此变量来决定要打印多少信息。然后让信号处理程序调整变量的值。

我还建议 SIGUSR1 应该增加变量,SIGUSR2 应该 减少 它。这样您就可以根据需要提高和降低日志级别。

sig_atomic_t 可能非常小,并且不能保证是有符号的或无符号的:可移植程序只能使用它来存储 0 到 127 范围内的值(含 0 和 127)。因此,请确保您的信号处理程序将该值限制在对您的程序有意义的范围内(即,不要将日志级别增加到超过最大值或将其降低到超过最小值)。

您需要确保您没有在程序中处理 env 变量。环境变量应该从你的 shell 中设置一次并且不要管它。 .. 毕竟,它们是环境变量。他们只是为您的程序设置或定义环境。

还有一种方法.... 您也可以实现 ioctl 调用 ..

甚至很多司机都在做同样的事情..