簡體   English   中英

在C中創建ls命令

[英]creating ls command in c

我正在嘗試創建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");  
  }  
 } 

由於execve()從不返回,因此不會循環。 而且,這似乎是實現ls一種非常奇怪的方式:您應該嘗試打開目錄並讀取其內容(文件列表),而不希望運行其他命令。

查看opendir()readdir()函數,這是實際實現ls的一種方法。

而且, 請不要在C中malloc()的返回值

它沒有循環,因為(引用手冊頁 ):

exec系列功能將當前的過程映像替換為新的過程映像。

換句話說, execvp()僅在出現錯誤時返回。

當我們討論這個主題時,您可能想閱讀fork-exec

我不確定路徑問題; execvp()當然應該搜索$PATH (並且在我在計算機上測試您的代碼時也execvp() ,因此ls/bin/ls可以很好地工作)。

要記住的一件事是fgets()返回終止的換行符,該換行符最終出現在args數組中。 例如,如果輸入不帶參數的ls並按Enter,則args[0]將設置為ls\\n ',而execvp()將會失敗。

哦,因為您從不釋放line所以內存泄漏。

這是使用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);
     }

暫無
暫無

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

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