微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有atfork处理程序的fork + exec

如何解决没有atfork处理程序的fork + exec

您可以使用vfork()(NPTL实现不调用fork处理程序)。尽管POSIX已从vfork标准中删除,但您的实现中可能会使用它。

当使用NPTL线程库的多线程程序调用vfork()时,不会调用使用pthread_atfork(3)建立的分叉处理程序。在这种情况下,使用LinuxThreads线程库在程序中调用Fork处理程序。(有关Linux线程库的描述,请参见pthreads(7)。)

或者,posix_spawn()。这类似于vfork。手册页说:

根据POSIX,它未指定在调用posix_spawn()时是否调用通过pthread_atfork(3)建立的fork处理程序。在glibc上,仅当使用fork(2)创建子项时才调用fork处理程序。

或者,syscall直接使用SYS_cloneSYS_clone是用于在Linux上创建线程和进程的系统调用号。所以syscall(SYS_clone, SIGCHLD, 0);应该工作,只要你会立刻EXEC键。

syscall(SYS_fork);(由Shachar回答)也可能会起作用。但是请注意,SYS_fork在某些平台(例如aarch64,ia64)上不可用。SYS_fork在Linux中被认为是过时的,仅是为了向后兼容,Linux内核使用SYS_clone创建所有“类型”的进程。

(注意:这些选项主要限于glibc / Linux)。

解决方法

我有一个注册了atfork处理程序的库(通过pthread_atfork()),该处理程序在fork()调用时不支持多个线程。就我而言,我不需要分叉的环境中使用,因为我要的是调用exec()右后fork()。所以,我想要fork()但没有任何atfork处理程序。那可能吗?我会错过任何重要的案例吗?

有关背景信息,该库为OpenBlas,此处此处均描述该问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。