Вы должны сделать свое собственное расширение подстановочного знака.Когда вы используете семейство функций exec()
, вы передаете аргументы почти напрямую новой программе.
Если вы хотите, чтобы замещающая программа заменяла подстановочные знаки для вас, вы можете использовать оболочку для выполненияэто (как и system()
), но будьте осторожны, так как вам нужно будет правильно указать кавычку для оболочки.
Пример:
char shell[] = "/bin/sh\0-c\0ls *.c";
char *args[] = { shell, shell+8, shell + 11, 0 };
execv("ls", args);
Обратите внимание также, что строковые литералы const char*
, поэтому не следует использовать для заполнения char*[]
.
Однако в случае find
вы, вероятно, не хотите расширить подстановочный знак,Здесь нет необходимости делать что-то особенное - просто введите *.c
в качестве одного из аргументов.Команде find
(в частности, аргумент -name
) требуется шаблон , а не список имен файлов, поэтому расширение не требуется:
char shell[] = "/usr/bin/find\0.\0-name\0*.c";
char *args[] = { shell, shell+14, shell + 16, shell+22, 0 };
execv("find", args);