在MacOS上线程中断的fork + exec进程? -子进程卡在_atfork_child中

时间:2019-09-24 08:26:25

标签: c++ multithreading macos fork exec

我们为macOS提供了一个更大的C ++应用程序。此应用程序有时有多个线程,它们分别在fork之后调用execforkexec之间没有什么特别的,只有一些dup2close的管道,没有锁,没有动态分配。调用fork时,其他父进程线程可能会进行一些动态分配,但是我认为这没关系。

我们有时看到在fork之后,子进程甚至没有从fork醒来,它挂了很长时间,当我们将调试器连接到它时,我们看到以下堆栈跟踪:

* thread #1, stop reason = signal SIGSTOP
  * frame #0: 0x00007fff79e0234a libsystem_kernel.dylib`syscall_thread_switch + 10
    frame #1: 0x00007fff79e7926a libsystem_malloc.dylib`tiny_malloc_should_clear + 547
    frame #2: 0x00007fff79e78f96 libsystem_malloc.dylib`szone_malloc_should_clear + 66
    frame #3: 0x00007fff79e7a188 libsystem_malloc.dylib`malloc_zone_calloc + 99
    frame #4: 0x00007fff79e7a108 libsystem_malloc.dylib`calloc + 30
    frame #5: 0x00007fff79da4a62 libsystem_coreservices.dylib`_dirhelper_init + 460
    frame #6: 0x00007fff79eafacb libsystem_platform.dylib`_os_once_callout + 18
    frame #7: 0x00007fff79da5ebb libsystem_coreservices.dylib`_libcoreservices_fork_child + 52
    frame #8: 0x00007fff76a1bb09 libSystem.B.dylib`libSystem_atfork_child + 39
    frame #9: 0x00007fff79d26d97 libsystem_c.dylib`fork + 40
...

因此,如果我理解正确,子进程甚至都没有从fork返回。

AFAIK我们的应用程序没有执行任何特殊操作,例如安装自定义atfork处理程序等。我们不使用Objective C的东西。我以为可能是new fork behavior for Objective C的原因,所以我们尝试禁用它(添加__DATA,__objc_fork_ok部分),但问题仍然出现。

这里有人知道是什么原因吗?

到目前为止,似乎多线程环境中的fork在macOS上才被破坏。这个问题不会经常发生,只是有时会发生-更令人讨厌。我不确定我们这边可能出什么毛病-当子进程一直挂在系统代码中时,它甚至无法执行我们的代码。

一个主意-fork可能同时从多个线程中被调用。这会引起问题吗,一次只能调用一个线程fork

感谢您的任何想法。

0 个答案:

没有答案