我想通过启动时在引导加载程序中配置的引导选项将一些参数传递给自定义的Linux init。
我已经在Python和C中编写了测试初始化.Python版本能够在内核启动选项中看到没有“=”或“。”的任何内容。在里面。值可在sys.argv中找到。但是,C程序似乎没有通过值。我原以为Python中的sys.argv列表是通过解析** argv数组生成的。下面是测试脚本和屏幕截图,希望有助于澄清。
内核启动行是:
kernel /grub/linux-2.6.38.4 root=/dev/vda1 init=/argv-{p|c} one two three four five
Python版本:
#!/usr/bin/python
import sys
i = 0
print("Printing argv[] (Python) ...")
for each in range(i, len(sys.argv)):
print("argv[%d] - %s" % (i, sys.argv[i]))
i += 1
print("...finished printing argv[]")
C版:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
printf("Printing argv[] (C) ...\n");
for(i; i < argc; i++) {
printf("argv[%d] - %s\n", i, argv[i]);
}
printf("...finished printing argv[]\n");
}
你可以在测试程序退出之前看到(并导致恐慌)python版本吐出内核没有消化的启动选项,而C版本没有。我查看了sysvinit源代码,它看起来对我(不是C开发)它的工作原理是一样的吗?
如何将启动选项传递给我的C init程序?
(哦,当没有以init身份运行时,C程序按预期工作)
答案 0 :(得分:3)
我不知道C,但我认为int i;
(第4行)应该是int i = 0;
。如果我错了,请在我的回答中添加注释,我会将其删除。
修改:您还可以在for循环中执行i = 0
:for(i = 0; i < argc; i++)
。
答案 1 :(得分:2)
正如阿图尔所说,你需要将我初始化为0。如果你不认为i的值是程序运行时在内存中发生的任何事情。有时它会工作,其他我会&gt; = argc并且循环将被跳过,最坏的情况我是负面的,你的程序会出现段错误。
同样在python中尝试:
# i do not need to be initialized
# for counting xrange is better, it does not built the whole list on memory
for i in xrange(1, len(sys.argv)):
print("arg[%d] - %s" % (i, sys.argv))
# i do not need to be incremented manually