获取shell环境以与execle一起使用

获取shell环境以与execle一起使用,c,exec,init.d,C,Exec,Init.d,我有一个程序需要运行其他程序。从正常终端会话运行时,它工作正常。当使用initscript运行时,它不会得到正常的shell环境,大多数程序都会失败。那么我如何让它与initscript一起工作呢 vixie cron似乎使用execle()和pass envp作为参数。但是我很难弄清楚它是如何获得shell环境设置的 以下是当前无法与initscript一起正常工作的代码: pid = fork(); if (pid < 0) { exit(EXIT_FAILURE); } el

我有一个程序需要运行其他程序。从正常终端会话运行时,它工作正常。当使用initscript运行时,它不会得到正常的shell环境,大多数程序都会失败。那么我如何让它与initscript一起工作呢

vixie cron似乎使用execle()和pass 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);
}
pid=fork();
if(pid<0){
退出(退出失败);
}否则如果(pid==0){
execl(“/bin/sh”、“/bin/sh”、“-c”、cmd、(char*)NULL);
退出(退出失败);
}

编辑:发生了一些奇怪的事情。现在,即使由init脚本启动,该程序也可以正常运行。对不起,这是个没用的问题。不管怎样,我得到了很好的答案。感谢您的帮助。

环境变量通过可选的第三个
main()
参数传递给您的程序并由其访问。只需将您的主要功能原型如下:

int main(int argc, char *argv[], char *envp[])
。。。以访问这些变量

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


您可以在手册页中看到这一点。

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