如何使用“ * .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/