如何在C ++中正确运行shell脚本

时间:2015-04-14 10:46:30

标签: c++ shell sh

我试图在我的.cpp文件中执行此操作:

system("/home/user/workspace/script.sh");

我只想打开它,让它在shell上运行然后忘掉它。到目前为止我的解决方案就是这样做:

pid_t pid = fork();
if (pid == 0) {
    system("/home/user/workspace/script.sh");
}

它有效。问题是我不确定这是否已经完成,但即使是这样,我也会收到一些我不想在输出中看到的警告:

(gnome-terminal:8105): GLib-GIO-CRITICAL **: g_settings_get: the format string may not contain '&' (key 'monospace-font-name' from schema 'org.gnome.desktop.interface'). This call will probably stop working with a future version of glib.

(gnome-terminal:8105): Vte-2.90-WARNING **: No se pueden convertir caracteres de UTF-8 a actual.

(gnome-terminal:8105): Vte-2.90-WARNING **: No se pueden convertir caracteres de UTF-8 a actual.

(gnome-terminal:8105): Vte-2.90-WARNING **: No se pueden convertir caracteres de UTF-8 a actual.
Unhandled value type TerminalEncoding of pspec encoding

有什么建议吗?非常感谢你。

1 个答案:

答案 0 :(得分:1)

system()函数导致使用当前shell运行一个单独的进程(这是解释字符串参数的内容),并且此进程的行为就像您手动从shell运行它一样(也就是说,它会吐出来)像往常一样,它的stdout和stderr流。你可以做两件事:

  • system()(正如评论中暗示)
  • 运行时,在某处重定向输出
  • 使用子进程通道重定向 - fork(),然后"使进程自身切换为命令"使用execl()。在fork()execl()之间,您可以close()不需要的流(1 = stdout,2 = stderr),如果这在尝试写入已关闭的文件时运行辅助进程时出现问题,你可以dup()给他们一个新的open() - ed描述符到" / dev / null"文件

实际上第二个解决方案与最终结果中的第一个解决方案相同 - 不同之处在于第二个解决方案不涉及shell来执行您的流程,但它更复杂。