加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby – fork,exec,detach …我们在这里有竞争条件吗?

发布时间:2020-12-16 20:04:07 所属栏目:百科 来源:网络整理
导读:简单的例子,在我的平台上不起作用( Ruby 2.2,Cygwin): #!/usr/bin/rubybacktt = fork { exec('mintty','/usr/bin/zsh','-i') }Process.detach(backtt)exit 这个小程序(当从shell启动时)应该跨越一个终端窗口(mintty),然后让我回到shell提示符. 但是,在创建m
简单的例子,在我的平台上不起作用( Ruby 2.2,Cygwin):
#!/usr/bin/ruby
backtt = fork { exec('mintty','/usr/bin/zsh','-i') }
Process.detach(backtt)
exit

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

但是,在创建mintty窗口时,我之后没有shell提示,并且我无法在调用shell中键入任何内容.

但是,当我在分离之前引入一个小的延迟,要么使用“睡眠”,或者通过在stdout上打印某些东西,它的工作原理如下:

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

为什么这是必要的?

BTW,我很清楚,我可以(从外壳)做一个

mintty /usr/bin/zsh -i &

直接或者我可以从Ruby里面使用系统(……&),但这不是这里的一点.我对Ruby中的fork / exec / detach行为感兴趣.任何见解?

解决方法

张贴作为答案,因为它是太长的评论

虽然我不是Ruby的专家,根本不知道Cygwin,但是这种情况听起来很熟悉,来自C/C++.

这个脚本太短,所以父级的父级完成,而孙子尝试开始.

如果您在分离后退出睡眠,会发生什么情况?

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

我称这种问题“手抖”.虽然这是心理术语,但它描述了发生了什么.

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

控制台输出(任何文件I / O)都会进入信号量,也导致线程切换.

如果我的想法是正确的,它也应该工作,如果你不“睡觉”,只要计算1e9(取决于计算速度),因为那么抢先的多任务使得线程切换本身不会放弃CPU.

所以编程中的错误(IMHO:种族条件在这种情况下是哲学的),但是很难找到“谁”是负责任的.有很多事情涉及.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读