[英]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.