1

我有一个 GUI C++ 程序,它从用户那里获取一个 shell 命令,调用 forkpty() 和 execvp() 在子进程中执行该命令,而父 (GUI) 进程读取子进程的 stdout/stderr 输出和在 GUI 中显示它。

这一切都很好(在 Linux 和 MacOS/X 下)。例如,如果用户输入“ls -l /foo”,GUI 将显示 /foo 文件夹的内容。

但是,不处理诸如输出重定向之类的 bash 细节。例如,如果用户输入“echo bar > /foo/bar.txt”,子进程将输出文本“bar > /foo/bar.txt”,而不是将文本“bar”写入文件“/ foo/bar.txt”。

这大概是因为 execvp() 直接运行可执行命令“echo”,而不是运行 /bin/bash 并将用户的命令交给按摩/预处理。

我的问题是,为了使系统的行为与用户在 bash 提示符下键入他的字符串完全一样,要使用什么正确的子进程调用?我尝试使用 /bin/bash 调用来包装用户的命令,如下所示:/bin/bash -c the_string_the_user_entered,但这似乎不起作用。有什么提示吗?

ps 只调用 system() 不是一个好的选择,因为它会导致我的 GUI 阻塞,直到子进程退出,并且一些子进程可能不会退出很长时间(如果有的话!)

4

1 回答 1

1

如果您希望 shell 执行 I/O 重定向,则需要调用 shell 以便它执行 I/O 重定向。

char *args[4];
args[0] = "bash";
args[1] = "-c";
args[2] = ...string containing command line with I/O redirection...;
args[4] = 0;

execv("/bin/bash", args);

注意从execvp()到的变化execv();你知道 shell 在哪里——至少,我给了它一个绝对路径——所以路径搜索不再相关。

于 2010-05-07T20:48:12.787 回答