如何使用“ * .c”运行execvp。我可以使用全名,但不能使用通配符。任何帮助将不胜感激。这是我到目前为止所拥有的。

#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;
}

最佳答案

您必须自己进行通配符扩展。使用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);

关于c - execvp查找通配符-name“* .c”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50637587/

10-13 04:22