gpt4 book ai didi

Ruby - fork、exec、detach ....我们这里有竞争条件吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:39 25 4
gpt4 key购买 nike

简单的例子,它在我的平台上不起作用(Ruby 2.2Cygwin):

#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
Process.detach(backtt)
exit

这个小程序(当从 shell 启动时)应该跨越一个终端窗口 (mintty) 然后让我回到 shell 提示符。

但是,虽然它确实创建了 mintty 窗口,但之后我没有 shell 提示符,而且我无法在调用 shell 中键入任何内容。

但是当我在分离之前引入一个小的延迟时,无论是使用“ sleep ”,还是通过在标准输出上打印一些东西,它都会按预期工作:

#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
sleep 1
Process.detach(backtt)
exit

为什么这是必要的?

顺便说一句,我很清楚我可以(从 shell)做一个

mintty /usr/bin/zsh -i &

直接,或者我可以从 Ruby 内部使用 system(...... &),但这不是这里的重点。我对 Ruby 中的 fork/exec/detach 行为特别感兴趣。有什么见解吗?

最佳答案

发布为答案,因为评论太长了

虽然我不是 Ruby 专家,也完全不了解 Cygwin,但这种情况对我来说非常很熟悉,来自 C/C++。

此脚本太短,因此父级的父级完成,而孙级尝试开始。

如果在 detach 之后和 exit 之前放置 sleep 会发生什么?

如果我的理论是正确的,它也应该有效。您的程序在任何(或足够多)线程切换发生之前退出。

我把这样的问题称为“间断的握手”。虽然这是心理学术语,但它描述了发生的事情。

sleep“放弃时间片”,导致线程切换,

控制台输出(任何文件 I/O)遇到信号量,也会导致线程切换。

如果我的想法是正确的,它也应该工作,如果你不“ sleep ”,只需数到 1e9(取决于计算速度),因为抢占式多任务处理甚至线程切换本身也不会放弃 CPU。

所以这是编程中的一个错误(恕我直言:在这种情况下,竞争条件是哲学上的),但很难找到“谁”负责。涉及的内容很多。

关于Ruby - fork、exec、detach ....我们这里有竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31260083/

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