为 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 调用 ..
甚至很多司机都在做同样的事情..
我的程序使用环境变量 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 调用 ..
甚至很多司机都在做同样的事情..