gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:25:26 30 4
gpt4 key购买 nike

我有一个 GUI C++ 程序,它从用户那里获取一个 shell 命令,调用 forkpty() 和 execvp() 在子进程中执行该命令,而父 (GUI) 进程读取子进程的标准输出/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 阻塞,直到子进程退出,并且一些子进程可能很长时间都不会退出(如果有的话!)

最佳答案

如果您希望 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 在哪里 - 至少,我给了它一个绝对路径 - 所以路径搜索不再相关。

关于c++ - 如何让 forkpty/execvp() 正确处理重定向和其他 bash-isms?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2791470/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com