【问题标题】:What is the difference between calling a script from the shell and using system()?从 shell 调用脚本和使用 system() 有什么区别?
【发布时间】:2013-07-13 15:32:57
【问题描述】:

我已经构建了一个 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% 的流程,除了一个。工作流程和非工作流程的唯一区别是非工作流程使用了下面的专有库。我最近在 bash 脚本中添加了 setsid 选项,希望启动一个新会话会有所帮助,但这并没有什么不同。我也试过popenexecv。不用找了。

所以我的问题是,用system() 调用某事和从命令行进行同样的调用有什么区别?

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

【问题讨论】:

  • 有什么不同:可能是环境?
  • 您是否检查了通常的嫌疑人 - 权限、LD_PATH、环境变量等? C++ 系统包装器是同一个用户和/或 root 等?您从 system、popen、execv 等返回什么样的 errno 值?
  • @Kerrek SB, @Duck 在~/.bashrc 中为该程序设置了环境变量,当我使用system() 启动程序时,如何确保/检查它们是否已设置?我认为调用 bash 脚本意味着 bashrc 得到了来源

标签: c++ linux process parent-child


【解决方案1】:

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

这意味着您有以下选择:

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

我推荐第一个选项。

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

【讨论】:

  • 前两个解决方案似乎不起作用,但我能够在我的 shell 脚本中包含一个 source 命令来设置所有相关的环境变量。你让我走上了正确的道路。谢谢!
【解决方案2】:

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

可能它们的来源不正确。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 2015-11-07
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多