gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:23:22 25 4
gpt4 key购买 nike

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

#!/bin/bash
# Start specified process in a new session
setsid $1 &>/dev/null &

所以要启动someprocess,我会从命令行调用:

root@supercomputer:~# start someprocess

这就像一个魅力。每一个过程,每一次。但是,当我从另一个正在运行的 C++ 进程进行 system 调用时,someprocess 永远不会启动。

system( "start someprocess" )

这种方法适用于我 90% 的流程,只有一个除外。工作进程和非工作进程的唯一区别是非工作进程使用底层的专有库。我最近将 setsid 选项添加到 bash 脚本中,希望开始一个新 session 会有所帮助,但没有任何区别。我还尝试了 popenexecv。没变。

所以我的问题是,使用 system() 调用与仅从命令行进行相同的调用有什么区别?

所有进程都在 Linux 上用 C++ 编写。

最佳答案

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

这意味着您有以下选择:

  • -l 添加到 shebang - 使 shell 在启动时读取 ~/.profile
  • 在调用 system() 之前将 $BASH_ENV 设置为您想要获取的脚本
  • -i 添加到 shebang - 调用 bash 作为交互式 shell 并使其读取 ~/.bashrc,但也会影响 bash 处理输入/输出的方式。

我推荐第一个选项。

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

关于c++ - 从 shell 调用脚本和使用 system() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17631606/

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