c - linux下用C中的execvp复制文件

标签 c linux execvp

女士们,先生们。我在 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/

相关文章:

c - 使用定时器进行套接字编程

ruby OpenSSL::SSL::SSLError

c - 重定向 stdin 和 stdout in child in c

linux - 如何让低帧率视频看起来更流畅?

c - fork after malloc in parent...子进程需要释放它吗?

c - git 的外部 shell cmd 源代码中的 execvp 调用返回 EFAULT(错误地址)errno,似乎仅在 64 位中。谷歌搜索什么也没透露

c - 了解警告 "comparison of promoted ~unsigned with unsigned"

c - 在使用 lldb 调试 macOS 应用程序时,是否可以使用观察点观察寄存器的内容以进行更改?

c - 使用宏初始化结构

c++ - 这段代码有什么问题?