C++ 从shell调用脚本和使用system()有什么区别?

C++ 从shell调用脚本和使用system()有什么区别?,c++,linux,process,parent-child,C++,Linux,Process,Parent Child,我已经构建了一个bash脚本来启动系统中的一些进程。它只调用进程和相关的配置文件。与我从命令行调用的相同 #!/bin/bash # Start specified process in a new session setsid $1 &>/dev/null & 因此,要启动someprocess,我将从命令行调用: root@supercomputer:~# start someprocess 这很有魅力。每一个过程,每一次。但是,当我从不同的运行C++进程中调用系统

我已经构建了一个bash脚本来启动系统中的一些进程。它只调用进程和相关的配置文件。与我从命令行调用的相同

#!/bin/bash
# Start specified process in a new session
setsid $1 &>/dev/null &
因此,要启动
someprocess
,我将从命令行调用:

root@supercomputer:~# start someprocess
这很有魅力。每一个过程,每一次。但是,当我从不同的运行C++进程中调用<代码>系统>代码>时,代码>某个进程< /> >永远不会启动。
system( "start someprocess" )
这种方法适用于我90%的流程,只有一个例外。工作流程和非工作流程的唯一区别在于,非工作流程在底层使用专有库。我最近在bash脚本中添加了
setsid
选项,希望启动一个新的会话会有所帮助,但没有什么不同。我还尝试了
popen
execv
。没有变化

因此,我的问题是,使用
system()
调用某个对象与仅从命令行调用同一个对象有什么区别


所有的进程都是在Linux上用C++编写的。p>

.bashrc
仅在bash作为交互式非登录shell运行时调用。如果它作为非交互式shell调用,比如在带有bash shebang的脚本上使用
system()
时,它只读取
$bash_ENV
指向的配置文件

这意味着您有以下选项:

  • -l
    添加到shebang-使shell在启动时读取
    ~/.profile
  • 在调用
    system()
  • -i
    添加到shebang中-将bash作为交互式shell调用,并使其读取
    ~/.bashrc
    ,但也会影响bash处理输入/输出的方式
我推荐第一种选择


您可以找到bash如何读取其启动文件的详细说明。我不确定这是否能完全解决您的问题,但它至少可以说明问题的这一部分。

检查system()调用中使用的环境变量。例如,调用system打印出一些变量,并查看它们是否与您从命令行看到的匹配


很可能它们的来源不正确。

有什么不同:可能是环境?您是否检查了常见的可疑因素-权限、LD_路径、环境变量等?C++系统包装器是相同的用户和/或根等?您从system、popen、execv等处得到了什么类型的errno值?@Kerrek SB、@Duck在
~/.bashrc
中设置了环境变量。对于此程序,如何确保/检查在使用
system()
启动程序时设置了环境变量?我假设调用bash脚本意味着
bashrc
获得了sourced前两个解决方案似乎不起作用,但我能够在shell脚本中包含一个source命令,用于设置所有相关的环境变量。你让我走上了正确的道路。谢谢