【问题标题】:How to run code after ruby Kernel.exec如何在 ruby​​ Kernel.exec 之后运行代码
【发布时间】:2013-09-26 02:55:47
【问题描述】:

我有以下红宝石外壳。

#!/usr/bin/env ruby

$stdin.each_line do |line|
  pid = fork{
    exec line
    puts "after exec -> #{Process.pid}"
  }
  Process.wait pid
end

exec 之后的 puts 方法永远不会执行。基于ri Kernel.exec,似乎exec 通过运行给定的外部进程替换了当前进程。因此,它应该用外部进程替换新的分叉进程。在exec 命令之后我应该如何运行任何东西?

【问题讨论】:

    标签: ruby shell unix


    【解决方案1】:

    你不能。

    根据Kernel#exec 的文档,“[它] 通过运行给定的外部命令来替换当前进程”。这意味着您不再运行您的代码,而是运行您通过命令指定的代码。

    如果你想“包装”一个系统调用,那么你应该使用Kernel#system(或backtick operator)在subshel​​l中执行命令。

    【讨论】:

    • 换句话说,如果你还没有完成,就不要拉开绳子。此外,system 比反引号样式更可取,因为它非常清楚您在做什么。
    • 但是有什么解决方法吗?如果我想运行一些外部命令然后修改结果怎么办?任何帮助将不胜感激。
    • 作为上下文,这实际上是 Unix 进程模型工作方式的核心。 没有原始调用可以用不同的程序启动一个新进程。相反,一个进程forks 本身变成了同一程序的两个副本,其中一个execs 变成了新程序。当它分叉时,它可以在父子之间建立一条通信线路(管道)。这就是反引号运算符为您所做的:构建管道、forks 和 execs。
    猜你喜欢
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2014-11-06
    相关资源
    最近更新 更多