Как выполнить ls *.txt в C

У меня возникают проблемы с выполнением подстановочного знака *.txt и чтением этой темы - exec() любой команды в C - указывает, что это сложно из-за проблем с "подстановкой". Есть ли простой способ обойти это?

Вот что я пытаюсь сделать:

char * array[] = {"ls", "*.txt", (char *) NULL };
execvp("ls", array);

person Aleksey Bilogur    schedule 23.01.2013    source источник
comment
Для фона: имейте в виду, что подстановочные знаки раскрываются оболочкой, а не командой. С вашим кодом, как показано выше, ls думает, что вы пытаетесь говорить о файле, который буквально называется *.txt.   -  person    schedule 23.01.2013


Ответы (2)


вы можете использовать системную команду:

system("ls *.txt");

чтобы оболочка выполняла подстановку за вас.

person Emanuele Paolini    schedule 23.01.2013

Чтобы ответить на этот вопрос, вы должны понимать, что происходит, когда вы набираете ls *.txt в своем терминале (эмуляторе). При вводе команды ls *.txt она интерпретируется shell. Затем shell выводит список каталогов и сопоставляет имена файлов в каталоге с шаблоном *.txt. Только после того, как все вышеперечисленное выполнено, shell подготавливает все имена файлов в качестве аргументов и порождает новый процесс, передающий эти имена файлов в виде argv массива в execvp.

Для того, чтобы собрать что-то подобное самостоятельно, посмотрите следующий вопрос/ответ:

В качестве альтернативы вы можете использовать system() как предложил @manu-fatto. Но эта функция будет делать немного другое — она фактически запустит программу shell, которая будет вычислять оператор ls *.txt, который, в свою очередь, выполнит действия, аналогичные описанным выше. Это, вероятно, будет менее эффективным и может создать дыры в безопасности (см. страницу руководства для получения более подробной информации, риски безопасности указаны в разделе ПРИМЕЧАНИЯ с предложением не использовать вышеуказанную функцию в определенных случаях).

Надеюсь, поможет. Удачи!

person Community    schedule 23.01.2013
comment
кто-то знает, что делает~! - person Aleksey Bilogur; 23.01.2013