[英]execve(…) does not execute program despite passing in PATH variable
我正在從目錄中執行一個簡單的shell程序:
/home/user/shell.exe
使用下面的代碼,我能夠運行與我的shell可執行文件位於同一文件夾中的文件,但是無法運行ls.exe等程序。
標記容器包括作為第一個元素的文件名和以下元素中的任何后續標記(例如輸入“ls.exe -l”中的“-l”)。
if (fork())
{
int status;
wait(&status);
}
else
{
std::vector<const char*> exeArgs;
std::vector<const char*> envArgs;
std::for_each(tokens.begin(), tokens.end(),
[&exeArgs](const string& elem){ exeArgs.push_back(elem.c_str()); }
);
exeArgs.push_back(nullptr);
string path = "PATH=";
path.append(getenv("PATH"));
envArgs.push_back(path.c_str());
envArgs.push_back(nullptr);
if (execve(exeArgs[0], const_cast<char *const *>(&exeArgs[0]),
const_cast<char *const *>(&envArgs[0])))
{
std::cout << word << ": command not found" << std::endl;
exit(0);
}
}
我花了無數個小時只是谷歌搜索和一遍又一遍地閱讀手冊頁但似乎無法弄清楚為什么這段代碼不起作用。
我的想法是我的shell程序應該允許用戶設置PATH變量然后用該PATH變量執行程序,這就是為什么我必須使execve()正常工作而不是僅使用execvp()。
我在文件的一個單獨部分有一個shell變量的映射,但由於我甚至無法使它工作,我認為包含它是沒有意義的。
你知道exec
系列函數替換當前的進程與新節目的形象? 這就是為什么在exec
之前使用fork
是如此常見。
與知識的武裝,很容易找到一個解決方案適合你,你可以如何使用execvp
(你需要使用, execve
並沒有真正使用你傳遞的環境,它只是將它傳遞給新程序):您fork
並使用setenv
在調用execvp
之前設置新進程的PATH
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.