execvp найти подстановочный знак -name "* .c" - PullRequest
0 голосов
/ 01 июня 2018

Как вы можете запустить execvp с "* .c".Я могу заставить его работать с полным именем, но не подстановочным знаком.Любая помощь будет принята с благодарностью.Это то, что я до сих пор.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(void) {
    printf("running\n");    
    char* args[] = { "find", "-name", "one.c",  NULL};
    char * envp[] ={NULL};

    int pid = fork();

    switch(pid){
        case -1:
            perror("fork() failed");
            exit(1); 
        case 0: // child
            execvp(args[0], args);
            printf("after the exec\n"); 
        default: // parent 
            //wait(NULL);
            if(wait(NULL) == -1){
                perror("wait() failed"); 
            }
    }

    return 0; 
}

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Вы должны сделать свое собственное расширение подстановочного знака.Когда вы используете семейство функций 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);
0 голосов
/ 01 июня 2018

Это по проекту .Обработка подстановочных знаков может быть дорогостоящей, поскольку требует просмотра папки.Обычно он активен по умолчанию в оболочке, но не в функциях API.Одно заметное исключение - system, потому что оно фактически передает команду оболочке:

Функция system () передает строку аргумента интерпретатору команды sh (1)

Функции семейства exec... не делают этого и предполагают, что путь является реальным путем и не выполняют специальной обработки для подстановочных знаков.Просто exec[lv]p берет всю папку из переменной среды PATH и пытается найти файл с точным именем в одном из них.

Вы должны использовать функцию glob дляобработка подстановочных знаков.Кстати, программы оболочки используют его ...

...