【发布时间】:2011-08-22 03:05:37
【问题描述】:
我想通过引导加载程序中配置的引导选项将一些参数传递给自定义的 Linux init。
我已经用 Python 和 C 编写了 test init。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 程序?
(哦,C程序在不作为init运行时按预期工作)
【问题讨论】:
-
您可以使用
for i, each in enumerate(sys.argv):而不是for each in range(i, len(sys.argv)):,并且正如Pablo 在他的回答中所说,没有必要增加i。 -
是的——当我写 python 测试时,我还在用 C 语言思考。