Я хотел бы передать некоторые параметры настраиваемой инициализации 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[]")
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?
(о, и программа C работает, как и ожидалось, когда не запускается как init)
for each in range(i, len(sys.argv)):
вы можете использоватьfor i, each in enumerate(sys.argv):
, и, как сказал Пабло в своем ответе, нет необходимости увеличивать i. - person Artur Gaspar   schedule 10.05.2011