如何让forkpty / execvp()正确处理重定向和其他bash-isms?

时间:2010-05-07 20:26:05

标签: c++ bash redirect execvp

我有一个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阻塞,直到子进程退出,并且一些子进程可能不会退出很长时间(如果有的话!)

1 个答案:

答案 0 :(得分: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的位置 - 至少,我给它一个绝对路径 - 所以路径搜索不再相关。