女士们,先生们。我在 C 程序中使用 execvp 复制文件时遇到问题,它只是不想工作。 tar 和 mv 命令也不起作用,我认为与创建文件有关的任何事情也有某种问题。奇怪的是,当使用 execvp 调用时,像 ls(及其选项)和 echo 这样的命令也能正常工作。
这里是有问题的代码:
int main () {
char *curr_working_dir, *input, *inputCpy, *command, **args;
struct timeval start, end, duration;
system("clear");
while(1) {
curr_working_dir = getcwd(NULL, 0);
printf("%s $ ", curr_working_dir);
free(curr_working_dir);
fgets(input, 200, stdin);
input[strlen(input) - 1] = '\0';
inputCpy = cpyInput(input);
command = strtok(input, " ");
if(!(strcmp(command, "exit"))) {
break;
}
else if(!(strcmp(command, "cd"))) {
command = strtok(NULL, " ");
struct stat s;
if(!stat(command, &s) && S_ISDIR(s.st_mode)) {
chdir(command);
}
else {
chdir(getenv("HOME"));
}
free(inputCpy);
command = NULL;
}
else {
int pid = fork();
if(pid < 0) {
printf("Error al crear el proceso hijo\n");
}
else if(pid == 0) {
args = constructArgs(inputCpy);
execvp(command, args);
printf("execvp fallo: %s\n", strerror(errno));
}
else {
gettimeofday(&start, NULL);
wait((int*)NULL);
gettimeofday(&end, NULL);
timersub(&end, &start, &duration);
printf("Duracion del comando: %ld.%06ld\n", (long int)duration.tv_sec, (long int)duration.tv_usec);
free(inputCpy);
command = NULL;
}
}
}
return 0;
以下是我在程序中使用的一些辅助函数:
char **constructArgs(char *input) {
int i = 0;
char *argActual, **args;
argActual = strtok(input, " ");
args = malloc(sizeof(char *));
while(argActual != NULL) {
args[i] = malloc((strlen(argActual) + 1) * sizeof(char));
strcpy(args[i], argActual);
i += 1;
args = realloc(args, (i + 1) * sizeof(char *));
argActual = strtok(NULL, " ");
}
args[i] = NULL;
return args;
}
char *cpyInput(char *input) {
char *cpy;
cpy = malloc((strlen(input) + 1) * sizeof(char));
strcpy(cpy, input);
return cpy;
}
我使用 constructArgs 为我将通过 execvp 调用的特定程序构建一个 args 数组,方法是解析包含命令及其参数的输入字符串。我可以更改目录、调用 echo、列出目录的内容,但是当我尝试运行 cp、mv 或 tar 时,它什么也做不了。
我已经检查过我向 execvp 发送了正确的信息;例如,看看这个:
假设我在/home/john/r1.sav 中有一个文件,我想将其复制到位于/home/john/anotherfolder 中的另一个文件夹。我调试了我的程序,这就是我在调用 execvp 之前得到的命令和 args 参数的内容:
命令=cp
参数[0] = cp
args[1] =/home/john/r1.sav
args[2] =/home/john/anotherfolder
如果您想通过它使用 cp,这些是 execvp 的预期输入。但它拒绝做任何事情。 execvp 接收要执行的程序的名称作为其第一个参数,以及程序将需要的参数数组,参数数组中的第一个参数也具有程序的名称,这就是我正在做。使用 ls 或 echo 一切正常,但使用 cp、mv 或 tar 则不行。
提前感谢您对这个特殊问题的任何帮助。
最佳答案
我看到这篇文章是因为我遇到了同样的问题。我不知道问题出在哪里,但是一旦我为返回值声明了一个 int,它就起作用了!
char *cmd = "cp";
char *argv[3];
argv[0] = "cp";
argv[1] = "source.c";
argv[2] = "destination.c;
int value = execvp(cmd, argv);
//不可达
关于c - linux下用C中的execvp复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28575643/