繁体   English   中英

没有atfork处理程序的fork + exec

[英]fork+exec without atfork handlers

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

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

您可以使用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_clone SYS_clone是用于在Linux上创建线程和进程的系统调用号。 所以syscall(SYS_clone, SIGCHLD, 0); 应该可以工作,只要您立即执行。

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

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

是。 以下内容应在Linux(以及所有基于glibc的平台)上运行:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>

...
  syscall(SYS_fork);

这将绕过库并直接调用fork的系统调用。 如果您的平台未将fork实现为单个系统调用,则可能会遇到麻烦。 对于Linux,这只是意味着您应改为使用clone

考虑到这一点,我不确定我会建议这样做。 由于您是图书馆,所以您不知道为什么有人注册了atfork 假定它无关紧要是不好的编程习惯。

因此,为了做某事可能会破坏东西或可能不会破坏东西,您失去了便携性,这是什么意思呢? 保存一些函数调用? 就个人而言,我只会使用fork

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM