【问题标题】:Executing external program via system() does not run properly通过 system() 执行外部程序无法正常运行
【发布时间】:2009-10-23 09:56:57
【问题描述】:

我尝试通过调用 system() 调用中的命令从我的代码中调用程序(ncbi blast,对于那些需要知道的人)。

如果我直接在 shell 中执行字符串,它会按预期工作,但如果我通过 system() 尝试相同的字符串,程序会更快地返回,但没有预期的结果。输出文件已创建,但文件大小为 0。返回的错误代码也为 0。我什至尝试附加 "> output.log 2> error.log" 但未创建这些文件。

我猜它与环境变量或路径有关......

输出文件名是通过 -o 命令行参数给出的,而不是输出重定向。

我读到一些关于 popen 命令可能更适合我的用例的内容,但我找不到它,它来自哪个库?

【问题讨论】:

  • 尝试在 system() 调用中指定程序的完整路径?
  • 如何启动父应用?
  • @moonshadow 是的,为 system() 调用指定了完整路径
  • @Bernard 在我直接尝试调用的同一 shell 中。 ".\myProgram"
  • 重定向操作符只在shell环境下工作,不会通过系统影响app的行为。您确定文件不是在其他地方创建的吗?

标签: c++ linux system


【解决方案1】:

此类问题的最常见原因是~/.bashrc 中的环境变量设置不正确。

你应该可以通过执行看到ncbi对什么不满

$SHELL -c '<exact string you pass to system()>'

另一种常见的调试方法是使用strace。执行:

strace -fo /tmp/strace.out ./myProgram

并在/tmp/strace.out 中寻找线索。

【讨论】:

    【解决方案2】:

    你有什么理由不想forkexec?这是从另一个进程执行一个进程的常用习惯用法。

    【讨论】:

      【解决方案3】:

      popen 在标准 C 库中 See the man page

      【讨论】:

      • 谢谢。不幸的是,用类似的 popen() 调用交换 system() 并没有产生预期的结果。使用 popen(),我尝试查看可能的错误消息或任何输出,但没有成功。
      • 出于兴趣,您不能直接调用该程序有什么原因吗?我用谷歌搜索了你提到的程序,不能说这是我的领域!
      • 如果 system() 不起作用,那么使用 popen() 将无法解决问题。如果它确实与 system() 一起工作,那么交换到 popen() 可能会更好。
      • @Chris:我正在编写一个包装程序,它执行参数扫描和类似的操作,多次调用 blast。
      【解决方案4】:

      一些简单的问题:

      • 如何在 shell 中执行?
      • 如何在系统命令中执行?
      • 系统返回的值是多少?

      从您的终端精确复制和粘贴比英文描述更可取。

      【讨论】:

        猜你喜欢
        • 2012-04-03
        • 2012-04-09
        • 2023-02-16
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-14
        相关资源
        最近更新 更多