2014-04-16 86 views
0

我正在嘗試創建ls命令。首先,如果我輸入「ls」,則代碼不起作用,它只在進入完整路徑時才起作用。其次,它不在exevcp()之後循環。爲什麼? 謝謝。在c中創建ls命令

#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"); 
    } 
} 
+1

'它不在exevcp()之後循環。爲什麼? - exec()系列函數用當前過程映像替換當前過程映像。因此,在'execvp()'之後,您的初始過程不再存在。 –

回答

2

這不是循環,因爲execve()永遠不會返回。此外,這似乎是一個非常奇怪的方式來實現ls:你應該嘗試打開一個目錄並閱讀它的內容(文件列表),而不是運行另一個命令,我期望。

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

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

1

這不是循環,因爲(引自man page):

exec家庭的功能用一個新的進程映像替換當前的進程映像。

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

雖然我們在這個問題上,你可能想要閱讀fork-exec

我不確定路徑問題; execvp()當然應該搜索$PATH(當我在我的計算機上測試您的代碼時,確實如此,因此ls/bin/ls同樣適用)。

有一點要記住的是,fgets()返回終止換行符,最終在args陣列。例如,如果輸入ls不帶參數並按回車鍵,則args[0]將被設置爲ls\n',並且execvp()將失敗。

哦,你有內存泄漏,因爲你永遠免費line

+0

正確 - args [0]會指向''ls \ n「' - 這就是問題第一部分的原因(對我來說,它甚至不能用完整路徑工作 - 不知道爲什麼它應該用於OP) –

+0

@安德里亞斯:謝謝。我將「完整路徑」解釋爲「/ bin/ls」,而不僅僅是「ls」。但是,這可能是OP正在談論其他事情(例如'ls'的參數)。 – NPE

+0

沒錯,在這種情況下,它會找到'ls',因爲它不包含最終的'\ n' - 但是不能找到路徑參數,因爲它會以'\ n';結尾(像'/ tmp \ n') –

0

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