簡體   English   中英

盡管傳入PATH變量,execve(...)也不會執行程序

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

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