我有一个GUI C++程序,它接受用户的shell命令,调用forkpty()和execvp()在子进程中执行该命令,而父进程读取子进程的stdout/stderr输出并将其显示在GUI中。如何获得forkpty/execvp()来正确处理重定向和其他bash-isms?
这一切都很好(在Linux和MacOS/X下)。例如,如果用户输入“ls -l/foo”,GUI将显示/ foo文件夹的内容。
但是,不会处理输出重定向等bash细节。例如,如果用户输入“echo bar> /foo/bar.txt”,子进程将输出文本“bar> /foo/bar.txt”,而不是将文本“bar”写入文件“/富/跳回到bar.txt”。推测这是因为execvp()直接运行可执行命令“echo”,而不是运行/ bin/bash,并将用户的命令传递给按摩/预处理。
我的问题是,什么是正确的子进程调用使用,为了使系统的行为完全一样,如果用户在bash提示符下键入他的字符串?我尝试用/ bin/bash调用来包装用户的命令,如下所示:/ bin/bash -c the_string_the_user_entered,但这似乎不起作用。任何提示?
PS只调用系统()是不是一个好的选择,因为这将导致我的GUI阻塞,直到子进程退出,有的子进程可能不会退出很长一段时间(如果有的话!)