[英]fork+exec pattern could be substituted by system(run-command-in-background)?
[英]fork+exec without atfork handlers
您可以使用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.