【问题标题】:creating ls command in c在c中创建ls命令
【发布时间】:2014-05-30 22:10:06
【问题描述】:

我正在尝试创建 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");  
  }  
 } 

【问题讨论】:

  • it's not looping after the exevcp(). why? - exec() 系列函数用新的过程映像替换当前过程映像。所以execvp()之后,你的初始进程就不存在了。

标签: c linux ls


【解决方案1】:

这是使用c 实现ls 命令的简单方法。运行使用例如./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);
     }

【讨论】:

    【解决方案2】:

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

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

    还有,please don't cast the return value of malloc() in C

    【讨论】:

      【解决方案3】:

      它没有循环,因为(引用man page):

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

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

      当我们讨论这个主题时,您可能想阅读fork-exec

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

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

      哦,你有内存泄漏,因为你从来没有释放line

      【讨论】:

      • 正是 - args[0] 将指向"ls\n" - 这就是问题第一部分的原因(对我来说,它甚至不适用于完整路径 - 不知道为什么它应该对于 OP)
      • @Andreas:谢谢。我将“完整路径”解释为/bin/ls,而不仅仅是ls。但是,可能是 OP 在谈论其他事情(例如 ls 的论点)。
      • 对,在这种情况下,它会找到ls,因为它不包含最终的\n - 但是会找不到路径参数,因为它会以\n 结尾;) (如/tmp\n
      • 如果您键入路径只是因为 \n 将在 args 中结束并且 execvp 不会失败,则它可以工作。如果你在没有 args[1] 的情况下键入 ls,\n 将在 args[0] 中结束。
      • @urzeit:它仍然会失败,只是不同(ls 命令将无法找到任何文件并显示错误消息)。
      猜你喜欢
      • 2016-07-25
      • 2017-04-09
      • 2012-11-13
      • 2021-03-05
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      相关资源
      最近更新 更多