我真的迷路了。构建 Linux shell,处理外部命令。我正在尝试创建一个新进程然后执行命令。对 exec()、fork()、pipe() 和 dup() 来说非常新,但我确信我在某个地方需要它们。
基本上我的问题是:将参数传递给 exec 的最佳方法是什么?我知道有很多选择,但是如果我有一个包含“ls -l”的字符串向量,我该如何将它传递给执行?我应该将其重新解析为“ls”和“-l”吗?
我已经有 fork() 创建子进程,但我不知道如何运行 exec()。
在一个有点相关的注释中,我应该在 fork() 的 waitpid 部分中添加什么
pid_t pid;
int status;
pid = fork();
if (pid < 0)
{
cout << "Fork failed." << endl;
}
else if (pid == 0)
{
execv("/bin/sh", (VECTOR OF COMMANDS?));
_exit (EXIT_FAILURE);
}
else
{
if (waitpid (pid, &status, 0) == pid)
{
cout << "huh?" << endl;
}
else
{
cout << "Error." << endl;
}
}
下一个障碍是管道,但当我到达那里时,我会越过那座桥。
编辑:
对于它的价值,这是我遇到问题的解析和调用。后面带有“ * *”的行似乎是给我带来问题的行
const char *args [1024];
string::iterator it5;
size_t pos5;
for (it5=origCstr.begin(); it5 < origCstr.end(); it5++)
{
string::iterator it2;
pos5 = origCstr.find(' ');
if (pos5 == string::npos)
{
tmpChar = origCstr.c_str();
args[argCount] = tmpChar;
argCount++;
break;
}
it2 = it5 + pos5;
tmpCstr = origCstr.substr(0, pos5);
tmpChar = tmpCstr.c_str();
args[argCount] = tmpChar;
origCstr.erase(it5, it2+1);
argCount++;
}
tmpChar = origCstr.c_str();
args[argCount] = tmpChar;
argCount++;
pid_t pid;
int status;
pid = fork();
if (pid < 0)
{
cout << "Fork failed." << endl;
}
else if (pid == 0)
{
execv("/bin/", args); ****
_exit (EXIT_FAILURE);
}
else
{
if (waitpid (pid, &status, 0) == pid)
{
cout << "huh?" << endl;
}
else
{
cout << "Error." << endl;
}
}