如何解决在fork中崩溃;从其他线程分叉可避免崩溃
TLDR:在下面概述的情况下,如果我打电话给fork()
,它会崩溃。如果我在新线程上fork()
会 不 崩溃。他们会怎么做导致fork()
崩溃?
我正在研究在vxsim
(VxWorks仿真环境)中运行的某些事物,并且在探索其某些局限性时遇到了这个问题。
vxsim
作为具有自己内部任务计划程序的单线程进程运行。它使用itimer()
(SIGALRM
)模拟适当的中断,在此期间,它使用setcontext()
(在Solaris中;在Linux中执行类似的操作)使当前(仅)线程恢复运行。在另一个任务上执行。
“ sim”功能和“ host”功能之间几乎没有真正的区别。 ABI是相同的;如果您碰巧拥有主机功能的地址(例如fork()
),则可以直接调用它。
唯一要注意的是,应该首先调用一个函数来禁用模拟中断等。
作为一个实验,我将其称为fork()
,并且在该调用期间崩溃。相反,如果我创建一个新线程,那么在新线程上fork()
不会崩溃。
模拟在x86 Linux和sparc Solaris 10上都以这种方式表现。
为了进行比较,我在VxWorks(5.x)的较旧版本中做了同样的事情,并且工作正常。
我要钓鱼的是对这个问题的答案:
他们怎么做会导致
fork()
像这样崩溃?
解决方法
我发现这个[错误] bug report是针对glibc提出的,OP [或多或少]写道:
我用一个未初始化的结构实例调用
sigaction()
为SIGCHLD
设置处理程序时。稍后,当我致电fork()
并且SIGCHLD
处理程序执行后,我的程序崩溃了。
我设法证明他们确实确实在至少一个地方的代码中做到了这一点。为了测试这是否是罪魁祸首,在调用有问题的函数之前,我将%ESP
下的堆栈进行了零初始化。不幸的是,它仍然崩溃了,尽管我认为很可能还有其他地方在做这种事情。
加重伤害的是该公司不愿意修复它,除非我们支付额外的费用。叹气。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。