fork+exec without atfork handlers

前端 未结 2 758
别那么骄傲
别那么骄傲 2020-12-21 12:30

I have a library which registers an atfork handler (via pthread_atfork()) which does not support multiple threads when fork() is calle

2条回答
  •  独厮守ぢ
    2020-12-21 13:00

    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).

提交回复
热议问题