【问题标题】:ls: cannot access : No such file or directoryls:无法访问:没有这样的文件或目录
【发布时间】:2016-02-26 06:34:53
【问题描述】:

当我输入ls 时,我会收到两次此消息:ls: cannot access : No such file or directory。但是当我输入类似ls -l /tmp 或执行位于路径中的“c”代码时,一切都很好。任何想法出了什么问题? 我的代码:

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

int main()
{
    for (;;) {
        char *cmd,*splitcmd,*pr0,*pr1,*pr2;
        int i, j, nargc = 0, characters;
        char **cmdArray;
        size_t bufsize = 1024;
        pid_t pid, wpid;
        int status = 0;

        printf("Type a command : \n");

        cmd = (char *) malloc(bufsize * sizeof(char));
        characters = getline(&cmd, &bufsize, stdin);
        // printf("cmd===> %s  characters===>  %d \n",cmd,characters);
        if (cmd[characters-1] == '\n')
        {
            cmd[characters-1] = '\0';
            characters--;
        }
        // printf("cmd===> %s  characters===>  %d \n",cmd,characters);

        cmdArray = (char**) malloc(bufsize * sizeof(char *));
        for (i = 0 ; i < bufsize ; i++)
        {
            cmdArray[i] = (char*) malloc(bufsize*sizeof(char));
        }
        splitcmd = strtok(cmd," ");
        //   printf(" cmd====  %s\n",cmd);
        while ((splitcmd))
        {
            cmdArray[nargc] = splitcmd;
            if (cmdArray[nargc][(strlen(cmdArray[nargc])) - 1] == ' ')
                cmdArray[nargc][(strlen(cmdArray[nargc]))-1] == '\0';
            // printf(" nargc====%d  cmdArray===[  %s  ]                       \n",nargc,cmdArray[nargc]);
            nargc++;
            pr0 = cmdArray[0];
            pr1 = cmdArray[1];
            pr2 = cmdArray[2];

            splitcmd = strtok(NULL," ");
            //printf(" pr0  %s   \n",pr0);
            //printf(" pr1  %s   \n",pr1);
            //printf(" pr2  %s   \n",pr2);
        }

        if ((pid = fork()) == 0)
        {
            char *argv[] = {pr0, pr1, pr2, NULL};
            execvp(argv[0],argv);
            for (int i = 0; i < 100; i++) {
                free(cmdArray[i]);
            }
            free(cmdArray);
        }
        wait(&status);
    }
}

【问题讨论】:

  • 请修正你的代码,缩进和格式化等。不要将void *的结果转换成c。
  • 代码可以编译吗?而且你不能执行c 代码。
  • 看来pr1pr2 将指向ls 案例的垃圾数据。换句话说,cmdArray[1]cmdArray[2] 在这种情况下是未初始化的。在命令标记被完全拆分之前,在while 循环内设置pr0pr1pr2 至少会令人困惑。
  • 它编译并且我可以执行它。但是当我输入ls 输入时,我会收到ls: cannot access ... 消息。 @iharob
  • 啊!所以你知道你正在使用垃圾值并且你仍然继续这样做并且没有尝试修复它或告诉我们你故意在代码中留下错误?如果您确实已经知道这是一个问题,至少您可以指出这一点。解决方法是编写代码来处理不同数量的参数,方法是使 argv 成为动态大小的数组,并仅使用正确的参数填充它。

标签: c ls


【解决方案1】:

您的代码存在许多问题,其中许多问题是通过打开警告来识别的。如果您的编译器支持,请使用-Weverything,如果不支持,请至少使用-Wall。但是,您的具体问题是您如何称呼execvp()

char *argv[] = {pr0, pr1, pr2, NULL};
execvp(argv[0],argv);

这将总是将两个参数传递给ls。即使pr1pr2 为空,ls 仍然会像传递参数一样表现。 ls 将通过查找 NULL 条目来确定它有多少个参数。

您的代码有一个缺陷,它试图通过将cmdArray 拆分为单个变量来硬编码参数的数量。这是行不通的。对于初学者来说,命令需要两个以上的参数。您应该将cmdArray 保留在一起,正确地以NULL 终止它,然后将其传递给execvp

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多