簡體   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