我们有一个存根,我们从inittab启动execv是我们的进程。 (ARM Linux内核2.6.25)
测试进程时,只有从inittab和execv'd启动时才会失败。如果在命令行上启动,它每次都能完美运行。
该过程大量使用SYS V IPC。
我应该注意两种启动方法之间有什么区别吗?
答案 0 :(得分:2)
正如马修所说,它可能是一个变量问题。在两种情况下通过存根或“手动”调用程序之前尝试转储你的环境列表。
顺便说一句,如果您能提供有关程序崩溃原因的更多信息,它可能会有很大帮助。日志文件? core dump / gdb?从execve返回值?
编辑: 其他检查:你确定传递完全相同的参数列表(如果有参数)?
要回答您的问题,两种方法之间没有区别。实际上你的shell fork()并最终调用execve()来启动你的进程,用你手工提供的参数和你在shell中设置的环境变量来提供它。顺便说一句,通过init启动你的程序,它可以在你的机器启动的早期阶段启动它。你确定一切都准备就绪,以便在那时运行你的应用程序吗?
答案 1 :(得分:1)
这可能是环境变量的问题吗?如果是这样,请考虑将execve或execle与适当的envp参数一起使用。
答案 2 :(得分:0)
环境变量建议非常好 - 特别是我检查$ PATH以确保找到您的依赖库(如果有的话)。您可以检查的另一件事是,当您作为inittab运行时,是否在相同的uid / gid下运行?
答案 3 :(得分:0)
如果用shell脚本替换存根? 如果它从命令行运行,它应该从shell脚本工作,你可以知道它是你的存根还是它在inittab中的事实。
这可能是一个控制性的问题吗?
shell脚本的另一个优点是您可以编辑它并strace您的程序以查看它失败的位置
答案 4 :(得分:0)
是不匹配的内核/库问题。完全重新编译后,一切都清理干净了。