[英]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.