【问题标题】:Get shell environment for use with execle获取用于 execle 的 shell 环境
【发布时间】:2014-08-20 01:10:11
【问题描述】:

我的程序需要运行其他程序。从正常终端会话运行时它工作正常。当使用 initscript 运行时,它不会获得正常的 shell 环境,并且大多数程序都会失败。那么我怎样才能让它与 initscript 一起工作呢?

vixie-cron 似乎使用 execle() 并将 envp 作为参数传递。但是我很难弄清楚它是如何获得 shell 环境设置的。

这是当前无法与 initscript 一起正常工作的代码:

pid = fork();
if (pid < 0) {
    exit(EXIT_FAILURE);
} else if (pid == 0) {
    execl("/bin/sh", "/bin/sh", "-c", cmd, (char *) NULL);
    exit(EXIT_FAILURE);
}

编辑:发生了一些奇怪的事情。现在,即使由 init 脚本启动,相同的程序也可以正常运行。对不起,这是一个无用的问题。无论如何,我得到了很好的答案。谢谢你的帮助。

【问题讨论】:

  • 究竟是什么不工作?有什么错误?为什么不报告代码中的错误?这似乎是一个人在面对意外行为时要做的第一件事......
  • (shell-)环境在很大程度上取决于运行进程的用户。你检查了吗?
  • 获取环境变量的常用方法是调用getenv()。这可能是你看不到的。
  • Vixie-cron 从自动设置为用户名的 USER 等内置变量获取环境变量,以及您放入 crontab 文件中的变量分配。您需要决定需要设置哪些变量,并将它们添加到您在execle 中使用的环境数组中。
  • 您可以在调用execl之前使用putenv(),而不是使用execle()

标签: c exec init.d


【解决方案1】:

环境变量通过可选的第三个main() 参数传递给您的程序并由您的程序访问。像这样简单地原型化您的主要功能:

int main(int argc, char *argv[], char *envp[])

... 访问这些变量。

然后您可以将其直接传递给exec*e() 系列函数。

您可以在 execve(2) 手册页中看到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多