2

我想通过引导加载程序中配置的引导选项将一些参数传递给定制的 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

蟒蛇版本:

#!/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[]")

Python 初始化 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");
}

C 初始化 argv 测试

您可以在测试程序退出(并导致恐慌)之前看到 python 版本吐出内核没有消化的引导选项,而 C 版本没有。我查看了 sysvinit 源代码,在我看来(不是 C 开发人员)它的工作方式相同吗?

如何将引导选项传递给我的 C init 程序?

(哦,C 程序在不作为 init 运行时按预期工作)

4

2 回答 2

3

我不知道 C,但我认为int i;(第 4 行)应该在哪里int i = 0;。如果我错了,请在我的答案中添加评论,我将删除它。

编辑:你也可以i = 0在 for 循环中做:for(i = 0; i < argc; i++)

于 2011-05-10T03:07:25.080 回答
2

正如 Artur 所说,您需要将 i 初始化为 0。如果你不知道,我的值就是程序运行时内存中发生的任何事情。有时它会起作用,其他的 i 会 >= argc 并且循环会被跳过,最坏的情况 i 是负数并且你的程序段错误。

同样在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
于 2011-05-10T03:25:21.483 回答