代码之家  ›  专栏  ›  技术社区  ›  Jeremy Friesner

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

  •  1
  • Jeremy Friesner  · 技术社区  · 16 年前

    我有一个GUI C++程序,它使用来自用户的shell命令,调用FokpTy.()和Reavvp()来执行子进程中的命令,而父进程(GUI)进程读取子进程的STDUD/STDER输出,并将其显示在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用户输入的字符串,但似乎不起作用。有什么线索吗?

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

    1 回复  |  直到 16 年前
        1
  •  1
  •   Jonathan Leffler    16 年前

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

    推荐文章