[英]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
。 即使pr1
和pr2
為空, ls
仍然會像傳遞參數一樣工作。 ls
將通過查找NULL條目來確定它具有多少個參數。
您的代碼有一個缺陷,那就是它試圖通過將cmdArray
為單個變量來硬編碼參數的數量。 這行不通。 對於初學者,命令采用兩個以上的參數。 您應該將cmdArray
放在一起,將其正確地NULL終止,然后將其傳遞到execvp
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.