You could use vfork()
(NPTL implementation doesn't call fork handlers). Although POSIX has removed vfork
from the standard, it's likely available on your implementation.
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.)
Or, posix_spawn()
. This is similar to vfork
. Man page says:
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).
Or, syscall
and directly use SYS_clone
. SYS_clone
is the system call number used to create threads and processes on Linux. So syscall(SYS_clone, SIGCHLD, 0);
should work, provided you would exec immediately.
syscall(SYS_fork);
(as answered by Shachar) would likely work too. But note that SYS_fork
not available on some platforms (e.g., aarch64, ia64). SYS_fork
is considered as obsolete in Linux and it's only there for backward compatibility and Linux kernel uses SYS_clone for creating all "types" of processes.
(Note: These options are mostly limited to glibc/Linux).
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…