Подобный вопрос в Linux эквивалент GetCommandLine и CommandLineToArgv
Можно ли получить сырье командная строка в linux? Файл / proc / self / cmdline уничтожен.
./a.out files="file 1","file 2" param="2"
печать
./a.outfiles=file 1,file 2param=2
что мусор
Выход из командной строки работает для всех аргументов, кроме первого.
./a.out files=\"fil 1\",\"fil 2\"\ param=\"2\"
печать
./a.outfiles="fil1","fil2" param="2"
Вы не можете сделать это. Аргументы командной строки фактически передаются новому процессу в виде отдельных строк. Посмотрите исходный код ядра Linux:
kernel_execve
Обратите внимание, что kernel_execve(...)
занимает const char *argv[]
— поэтому в Linux нет такой вещи, как командная строка с длинными строками — это слой выше, который должен разбивать аргументы на отдельные компоненты.
Изменить: на самом деле, системный вызов здесь:
Но приведенное выше заявление все еще применимо. Параметр для argv уже разделен к тому времени, когда ядро получает его от вызова C-библиотеки к exec.
Ответственность за создание массива argv [] несет «стартер программы» (обычно оболочка, но не обязательно). Он будет выполнять «globbing» (расширение имен файлов подстановочных знаков до фактических файлов, которым он соответствует) и извлечение цитат, замену переменных и так далее.
Я также хотел бы отметить, что хотя есть несколько вариантов exec в библиотеке C, в ядро есть только один путь. Все варианты заканчиваются в execve
Системный вызов, который я связал с выше. Другие варианты просто потому, что вызывающей стороне может не нравиться разделять аргументы на отдельные элементы, поэтому библиотека C «помогает», делая это для программиста. Аналогично для передачи массива среды в новую программу — если программисту не нужна конкретная среда, он может просто вызвать вариант, который автоматически принимает родительский процесс env.
Других решений пока нет …