2013-04-09 58 views
2

我目前正在努力解決這個錯誤。我正在編寫一個shell模擬器,使用fork()來執行使用execvp();的命令。 幾乎每個我試圖解析到shell的命令都能正常工作,除了ls沒有參數。 如果我嘗試執行LS -lah,一切正常,但一個簡單的LS不會,收到以下錯誤:execvp - ls:fts_open:沒有這樣的文件或目錄

ls: fts_open: No such file or directory 

這裏是我的代碼片段:(只是必需的)

pid = fork(); 
     if (pid==0) 
     { 
     puts("CHILD"); 
     puts(args[0]); 
     puts(args[1]); 
     printf("%d\n", strlen(args[1])); 
     args[2] = NULL; 
     execvp(args[0], args); 
     } 
     else wait(NULL); 
     puts("BACK TO PARENT"); 
    } 

和這裏爲LS的輸出:

ls 
CHILD 
ls 

0 
ls: fts_open: No such file or directory 
BACK TO PARENT 

,你可以看到,ARGS [0]包含LS,ARGS [1]是空的,因爲沒有參數,args來長度[1]是0,但我不斷收到錯誤。

想法是什麼?

編輯:

榮譽喬納森萊弗勒尋找出來:(也,現在看來似乎只是在Mac上的問題)

的一點是ARGS [1]是不是真的空,因此,操作系統會嘗試打開''文件,顯然,該文件不存在,並且根據外觀,無法創建,因爲它不是真正的名稱。

所以,這是我做的:檢查args的len [1]。如果它是0,則將其設置爲NULL。 (只是釋放內存並沒有真正幫助)

pid = fork(); 
     if (pid==0) 
     { 
     puts("CHILD"); 
     puts(args[0]); 
     puts(args[1]); 
     if (strlen(args[1]) == 0) 
      args[1] = 0; 
     args[2] = NULL; 
     execvp(args[0], args); 
     } 
     else wait(NULL); 
     puts("BACK TO PARENT"); 
    } 
+0

可以顯示'args'的完整定義(什麼'args [1]'設置爲,什麼是「空」?)以及更多的代碼? – 2013-04-09 03:39:50

回答

5

如果沒有更多的參數,指針爲空,而不是一個非空指針到零長度字符串。

pid = fork(); 
if (pid==0) 
{ 
    puts("CHILD"); 
    puts(args[0]); 
    fflush(stdout); 
    args[1] = 0; 
    execvp(args[0], args); 
    fprintf(stderr, "Failed to exec %s\n", args[0]); 
    exit(1); 
} 
else 
    wait(NULL); 
puts("BACK TO PARENT"); 

只是出於好奇純淨,我想這在我的命令行:

$ ls '' 
ls: fts_open: No such file or directory 
$ 

你在Mac上運行嗎? (說我驚訝地看到相同的消息並沒有開始描述我的反應!)更有趣的是創建一個文件fts_open似乎並沒有擺脫錯誤信息。奇怪的行爲由ls,但響應無效請求(沒有文件名稱是空字符串)。

+0

謝謝!我將更新我的問題以顯示我的代碼是如何變成的,但是,基本上,我檢查了args的len [1],如果它是0,則只是將其設置爲NULL。 – 2013-04-09 03:49:04

+0

是的,我也在Mac上運行。我做了一些快速的研究,似乎fts_open與操作系統有關。可能涉及檔案開放。 – 2013-04-09 03:51:17

+0

'fts_open'是遍歷目錄層次結構的內部函數。錯誤信息表示錯誤發生在函數fts_open中的程序'ls'中,該函數返回了錯誤代碼'ENOENT'。 – melpomene 2015-10-11 11:12:38

相關問題