【问题标题】:c++ fork exec from command vectorc ++ fork exec来自命令向量
【发布时间】:2012-06-03 02:52:53
【问题描述】:

我真的迷路了。构建 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;
    }
}

【问题讨论】:

  • 错误是:从'const char**'到'char* const*'的无效转换初始化'int execv(const char*, char* const*)'的参数2

标签: command exec fork


【解决方案1】:

您将需要调用“execv”,以便创建包含选项的char*[]。 "ls" 和 "-l" 在数组中各有自己的位置。

您必须抛弃 const,或使用 char `char const*[]' 数组,然后抛弃其上的 const 以将其传递给 execv。一般来说,这些系统调用的声明对 C++ 有点不友好。

a stack overflow question on this subject

http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html 有一个合理的教程。

粗略地说:

char * exec_args[1024];
int arg_count = 0;
std::vector<std::string> theArgs;

exec_args[arg_count++] = "/bin/whatever"; // leave command in argv[0]
for (int x = 0; x < theArgs.size(); x++) {
   exec_args[arg_count++] = strdup(theArgs[x].c_str());
}
exec_args[arg_count++] = 0; // tell it when to stop!

execv("/bin/whatever", exec_args);

【讨论】:

  • 好吧,这就是我的想法。所以这是菜鸟问题:现在我无法将它们传递到 char 数组中,因为它们被解析为字符串。当我重新解析时,这是我用来传递每个人的调用。 args[argCount] = tmpCstr.c_str();以上给了我“无效的转换 const char* 到 char*”错误
  • 没关系。弄明白了。现在我有一个“ls”和“-l”数组。我如何传递它?另外,char* 数组的大小是多少?
  • 我以前看过这两个文件,但是根本没有回答我的问题。因为我是从用户输入初始化数组而不是静态的,所以它没有帮助。拜托,我迫切需要帮助/示例
  • 取得重大进展,非常感谢@bmargulies。知道如何将“&”字符视为输入吗?一切都只是不断地跳过它
  • 我不知道这部分是关于什么的。也许一个新问题是合适的?我不知道你在读什么,你在读什么,或者缺少什么。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多