簡體   English   中英

execvp-ls:fts_open:沒有這樣的文件或目錄

[英]execvp - ls: fts_open: No such file or directory

我目前正在努力解決此錯誤。 我正在編寫一個shell模擬器,使用fork()使用execvp();執行命令。 除了沒有參數的ls之外,幾乎所有我嘗試解析到我的shell的命令都運行良好。 如果我嘗試執行ls -lah,則一切正常,但是一個簡單的ls不會,並收到以下錯誤:

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,但我一直收到錯誤消息。

有什么想法嗎?

編輯:

喬納森·萊夫勒(Jonathan Leffler)的榮譽:(同樣,這似乎在Mac上只是一個問題)

關鍵是args [1]並非真正為空,因此,操作系統嘗試打開''文件,該文件顯然不存在,並且從外觀上看無法創建,因為它不是真是個名字。

所以,這就是我所做的:檢查args [1]的len。 如果為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");
    }

如果沒有更多參數,則指針應為null,而不是指向零長度字符串的非null指針。

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奇怪的行為,但是響應無效的請求(沒有文件名是空字符串)。

暫無
暫無

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

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