Skip to content
Syscall BSD#2

svc · unix #2

fork

Duplique le processus appelant ; retourne le PID de l'enfant au parent et 0 dans l'enfant.

Prototype

int fork(void);

Retour: int

Historique des versions

XNU tagmacOS#
xnu-1456.1.26macOS 10.6 Snow Leopard2
xnu-1486.2.112
xnu-1504.15.32
xnu-1504.3.122
xnu-1504.7.42
xnu-1504.9.172
xnu-1504.9.262
xnu-1504.9.372

Exemples

Classic fork/exec

#include <unistd.h>
#include <sys/wait.h>

pid_t pid = fork();
if (pid == 0) {
    execlp("/bin/ls", "ls", "-l", NULL);
    _exit(127);
}
int status;
waitpid(pid, &status, 0);

Notes

Le fork() de XNU clone la struct proc BSD puis crée une nouvelle task Mach dont l'espace d'adressage est mappé copy-on-write depuis le parent. L'enfant hérite des descripteurs ouverts, du masque de signaux, du cwd et des limites de ressources, mais perd les timers en attente, l'I/O asynchrone et la majorité de l'état pthread. Apple décourage fork() dans toute app qui lie Cocoa ou CoreFoundation : seul du code async-signal-safe est légal entre fork() et execve().

Détection

Endpoint Security expose ES_EVENT_TYPE_NOTIFY_FORK avec l'es_process_t de l'enfant. La probe DTrace syscall::fork:return rapporte le PID de l'enfant dans arg0 depuis le contexte parent.

API associées

vforkexecveposix_spawnwait4waitidexit