我试图在我的.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
有什么建议吗?非常感谢你。
答案 0 :(得分:1)
system()
函数导致使用当前shell运行一个单独的进程(这是解释字符串参数的内容),并且此进程的行为就像您手动从shell运行它一样(也就是说,它会吐出来)像往常一样,它的stdout和stderr流。你可以做两件事:
system()
(正如评论中暗示)fork()
,然后"使进程自身切换为命令"使用execl()
。在fork()
和execl()
之间,您可以close()
不需要的流(1 = stdout,2 = stderr),如果这在尝试写入已关闭的文件时运行辅助进程时出现问题,你可以dup()
给他们一个新的open()
- ed描述符到" / dev / null"文件实际上第二个解决方案与最终结果中的第一个解决方案相同 - 不同之处在于第二个解决方案不涉及shell来执行您的流程,但它更复杂。