Передача загрузочных опций Linux в Init - PullRequest
2 голосов
/ 10 мая 2011

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

Я написал тестовые init как на 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 init?

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

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

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

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

2 голосов
/ 10 мая 2011

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

Также в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...