在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下的堆栈进行了零初始化。不幸的是,它仍然崩溃了,尽管我认为很可能还有其他地方在做这种事情。

加重伤害的是该公司不愿意修复它,除非我们支付额外的费用。叹气。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...