【问题标题】:Passing Linux boot opts to Init将 Linux 引导选项传递给 Init
【发布时间】: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 语言思考。

标签: python c linux boot init


【解决方案1】:

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

编辑:您也可以在 for 循环中执行 i = 0for(i = 0; i &lt; argc; i++)

【讨论】:

  • 是的,这是一个错字,但是在没有初始化的情况下运行程序时,它可以正常工作。我会解决这个问题并以 init 的身份再次尝试
  • 这是一个错字,它掩盖了我为查找问题而添加的调试代码 - 由于您的评论,我发现了这个问题。我讨厌仅仅几个包机就让你头疼几个小时。 :( 谢谢。
【解决方案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

【讨论】:

  • 我只是在 C 中度过了一整天——当我编写 python 脚本时,我还在用 C 思考。感谢您的反馈。
猜你喜欢
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2012-12-17
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多