gpt4 book ai didi

c - 在linux中为正在运行的程序设置环境变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:14 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

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

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

关于c - 在linux中为正在运行的程序设置环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31011207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com