Передача загрузки Linux выбирает Init

Я хотел бы передать некоторые параметры настраиваемой инициализации Linux через параметры загрузки, настроенные в загрузчике при загрузке.

Я написал тестовую инициализацию как на Python, так и на C. Версия Python может видеть в параметрах загрузки ядра все, что не имеет '=' или '.' в этом. Значения находятся в sys.argv. Однако программа C, похоже, не передает значения. Я бы подумал, что список sys.argv в Python был создан путем разбора массива **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[]")

Python init argv test

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 init argv test

Вы можете видеть непосредственно перед выходом тестовых программ (и вызывает панику), версия Python выдает параметры загрузки, которые ядро ​​​​не переварило, в то время как версия C этого не сделала. Я просмотрел исходный код sysvinit, и мне (не C-разработчику) кажется, что он работает так же?

Как мне передать параметры загрузки моей программе инициализации C?

(о, и программа C работает, как и ожидалось, когда не запускается как init)


person tMC    schedule 10.05.2011    source источник
comment
Вместо for each in range(i, len(sys.argv)): вы можете использовать for i, each in enumerate(sys.argv):, и, как сказал Пабло в своем ответе, нет необходимости увеличивать i.   -  person Artur Gaspar    schedule 10.05.2011
comment
Да, я все еще думал на C, когда писал тест на Python.   -  person tMC    schedule 10.05.2011


Ответы (2)


Я не знаю C, но думаю, где int i; (строка 4) должно быть int i = 0;. Если я ошибаюсь, добавьте комментарий к моему ответу, и я удалю его.

Изменить: вы также можете сделать i = 0 в цикле for: for(i = 0; i < argc; i++).

person Artur Gaspar    schedule 10.05.2011
comment
да, это опечатка, но при запуске программы без инициализации она работает нормально. Я исправлю это и попробую снова как init - person tMC; 10.05.2011
comment
Это была опечатка, которая скрывала код отладки, который я добавил, чтобы найти проблему, которую я обнаружил благодаря вашему комментарию. Ненавижу, когда всего несколько чартеров заставляют часами биться головой. :( Спасибо. - person tMC; 10.05.2011

Вам нужно инициализировать i до 0, как сказал Артур. Если вы этого не сделаете, значение i равно тому, что было в памяти во время запуска программы. Иногда это будет работать, в других случаях i будет >= argc, и цикл будет пропущен, в худшем случае i будет отрицательным, и ваша программа выйдет из строя.

Также в питоне попробуйте:

# 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
person Pablo Castellazzi    schedule 10.05.2011
comment
Я просто провел весь день в C — я все еще думал на C, когда писал скрипт на Python. Спасибо за ответ. - person tMC; 10.05.2011