簡體   English   中英

ls:無法訪問:沒有這樣的文件或目錄

[英]ls: cannot access : No such file or directory

當我鍵入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);
    }
}

您的代碼有很多問題,其中許多是通過打開警告來識別的。 如果編譯器支持,則使用-Weverything ,否則不使用-Wall 但是,您的特定問題在於如何調用execvp()

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

這將始終將兩個參數傳遞給ls 即使pr1pr2為空, ls仍然會像傳遞參數一樣工作。 ls將通過查找NULL條目來確定它具有多少個參數。

您的代碼有一個缺陷,那就是它試圖通過將cmdArray為單個變量來硬編碼參數的數量。 這行不通。 對於初學者,命令采用兩個以上的參數。 您應該將cmdArray放在一起,將其正確地NULL終止,然后將其傳遞到execvp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM