2010-05-07 19 views
1

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

回答

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()的变化;你知道壳的位置 - 至少,我给了它绝对路径 - 所以路径搜索不再相关。

相关问题