我正在从目录执行一个简单的shell程序:
/home/user/shell.exe
使用下面的代码,我能够运行与我的shell可执行文件位于同一文件夹中的文件,但无法运行ls.exe等程序。
标记容器包含文件名作为第一个元素以及以下元素中的任何后续标记(例如" -l"在输入" ls.exe -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变量的映射,但由于我甚至无法使其工作,我认为包含它是毫无意义的。
答案 0 :(得分:3)
您 知道fork
系列函数用新程序的图像替换当前进程?这就是为什么在exec
之前使用execvp
这么常见的原因。
有了这些知识,您可以轻松找到适合自己的解决方案,以及如何使用execve
(您需要使用fork
并没有真正使用您传递的环境,它只是将其传递给新程序):您setenv
并使用PATH
设置 new的execvp
进程,在致电clear; % Clear workspace.
clc; % Clear command line.
numP=input('Enter the number of points to test: ');
pi_c = 0; % Initialize the computed value of pi.
format long
count = 0; % Count resets to 0 after every value of m.
for j = 1:numP
x = rand; % Choose a random number 0 and 1.
y = rand; % Choose a random number 0 and 1.
if (x^2 + y^2 - 1 <= 0) % If the point falls in a circle...
count = count + 1; % Increment count.
end
end
pi_c = 4 * count/numP; % Computed value of pi.
disp(pi_c)
之前。