Python 将Linux引导选项传递给Init

Python 将Linux引导选项传递给Init,python,c,linux,boot,init,Python,C,Linux,Boot,Init,我想通过引导时在引导加载程序中配置的引导选项将一些参数传递给定制的LinuxInit 我已经用Python和C编写了test init。Python版本能够看到内核引导选项中没有“=”或“.”的任何内容。这些值位于sys.argv中。然而,C程序似乎没有传递这些值。我本以为Python中的sys.argv列表是通过解析**argv数组生成的。下面是测试脚本和屏幕截图,希望有助于澄清 内核引导行是: kernel/grub/linux-2.6.38.4 root=/dev/vda1 init=/a

我想通过引导时在引导加载程序中配置的引导选项将一些参数传递给定制的LinuxInit

我已经用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}一二三四五

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");
}
#包括
int main(int argc,字符**argv)
{
int i;
printf(“打印argv[](C)…\n”);
对于(i;i

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

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


(哦,C程序在不作为init运行时工作正常)

我不知道C,但我想int I在哪里(第4行)应为
inti=0。如果我错了,在我的回答中添加一条评论,我将删除它


编辑:您也可以在for循环中执行
i=0
for(i=0;i

您需要像Artur所说的那样将i初始化为0。如果你不知道,i的值就是程序运行时内存中发生的任何事情。有时它会工作,其他的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

是的,这是一个输入错误,但是当运行程序而不是init时,它工作得很好。我将修复这个问题,然后再试一次,因为这是一个拼写错误,它掩盖了我为查找问题而添加的调试代码——由于您的评论,我发现了这个问题。我讨厌仅仅几张特许证就让你头痛好几个小时(谢谢。对于范围(i,len(sys.argv))中的每个,您可以使用枚举(sys.argv)中的每个i,而不是
。):
,正如Pablo在回答中所说,没有必要增加i。是的-我在编写python测试时仍在考虑C。我只是花了一整天的时间在C中-我在编写python脚本时仍在考虑C。感谢您的反馈。