gpt4 book ai didi

c - 没有 atfork 处理程序的 fork+exec

转载 作者:太空狗 更新时间:2023-10-29 11:49:22 26 4
gpt4 key购买 nike

我有一个库,它注册了一个 atfork 处理程序(通过 pthread_atfork()),当 fork() 是叫。在我的例子中,我不需要派生的环境可用,因为我只想在 fork() 之后立即调用 exec()。所以,我想要 fork() 但没有任何 atfork 处理程序。那可能吗?我是否遗漏了任何重要的边缘案例?

对于背景信息,库是 OpenBlas,问题描述为 herehere .

最佳答案

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

Fork handlers established using pthread_atfork(3) are not called when a multithreaded program employing the NPTL threading library calls vfork(). Fork handlers are called in this case in a program using the LinuxThreads threading library. (See pthreads(7) for a description of Linux threading libraries.)

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

According to POSIX, it unspecified whether fork handlers established with pthread_atfork(3) are called when posix_spawn() is invoked. On glibc, fork handlers are called only if the child is created using fork(2).

或者,syscall 并直接使用SYS_cloneSYS_clone 是用于在 Linux 上创建线程和进程的系统调用号。所以 syscall(SYS_clone, SIGCHLD, 0); 应该可以工作,前提是你会立即执行。

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

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

关于c - 没有 atfork 处理程序的 fork+exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com