在c中创建ls命令

时间:2014-04-16 07:22:24

标签: c linux ls

我试图创建ls命令。首先,如果我输入" ls"则代码不起作用,它仅在我输入完整路径时起作用。其次,它在exevcp()之后没有循环。为什么? 谢谢。

#include<stdio.h>
#include<stdlib.h>
#include<string.h> 
#include<unistd.h>

int main(void){

 char *line;
 char *args[32]; 

 memset(args, 0, sizeof(args)); 
 while (1){
   line = (char*)malloc(1024); 
   printf("$ "); 
   fgets(line,1024,stdin); 
   args[0] = strtok(line, " "); 
   args[1] = strtok(NULL, " ");  

   execvp(args[0], args);
   perror("execvp");  
  }  
 } 

3 个答案:

答案 0 :(得分:2)

它不循环,因为execve()永远不会返回。此外,这似乎是一种非常奇怪的实现ls的方法:你应该尝试打开一个目录并读取其内容(文件列表),而不是运行另一个命令,我希望。

查看opendir()readdir()函数,这是实际实现ls的一种方式。

而且,please don't cast the return value of malloc() in C

答案 1 :(得分:1)

它不是循环因为(引用man page):

  

exec系列函数用新的过程映像替换当前过程映像。

换句话说,execvp()仅在出现错误时才会返回。

虽然我们正在讨论这个主题,但您可能需要阅读fork-exec

我不确定路径问题; execvp()当然应该搜索$PATH(并且当我在计算机上测试您的代码时,ls/bin/ls同样有效。)

要记住的一件事是,fgets()会返回终止换行符,该换行符最终会出现在args数组中。例如,如果您输入没有参数的ls并按Enter键,则args[0]将设置为ls\n',execvp()将失败。

哦,你有一个内存泄漏,因为你永远不会释放line

答案 2 :(得分:0)

以下是使用ls实现c命令的简单方法。要运行使用,例如./xls /tmp

    #include<stdio.h>
    #include <dirent.h>
    void main(int argc,char *argv[])
    {
   DIR *dir;
   struct dirent *dent;
   dir = opendir(argv[1]);   

   if(dir!=NULL)
      {
   while((dent=readdir(dir))!=NULL)
                    {
        if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
            {
            }
       else
              {
        printf(dent->d_name);
        printf("\n");
              }
                    }
       }
       close(dir);
     }