GetCommandLine linux * true * эквивалент

Подобный вопрос в 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"

3

Решение

Вы не можете сделать это. Аргументы командной строки фактически передаются новому процессу в виде отдельных строк. Посмотрите исходный код ядра Linux:
kernel_execve

Обратите внимание, что kernel_execve(...) занимает const char *argv[] — поэтому в Linux нет такой вещи, как командная строка с длинными строками — это слой выше, который должен разбивать аргументы на отдельные компоненты.

Изменить: на самом деле, системный вызов здесь:

системный вызов excve

Но приведенное выше заявление все еще применимо. Параметр для argv уже разделен к тому времени, когда ядро ​​получает его от вызова C-библиотеки к exec.

Ответственность за создание массива argv [] несет «стартер программы» (обычно оболочка, но не обязательно). Он будет выполнять «globbing» (расширение имен файлов подстановочных знаков до фактических файлов, которым он соответствует) и извлечение цитат, замену переменных и так далее.

Я также хотел бы отметить, что хотя есть несколько вариантов exec в библиотеке C, в ядро ​​есть только один путь. Все варианты заканчиваются в execve Системный вызов, который я связал с выше. Другие варианты просто потому, что вызывающей стороне может не нравиться разделять аргументы на отдельные элементы, поэтому библиотека C «помогает», делая это для программиста. Аналогично для передачи массива среды в новую программу — если программисту не нужна конкретная среда, он может просто вызвать вариант, который автоматически принимает родительский процесс env.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]