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 tag | macOS | # |
|---|---|---|
| xnu-1456.1.26 | macOS 10.6 Snow Leopard | 2 |
| xnu-1486.2.11 | — | 2 |
| xnu-1504.15.3 | — | 2 |
| xnu-1504.3.12 | — | 2 |
| xnu-1504.7.4 | — | 2 |
| xnu-1504.9.17 | — | 2 |
| xnu-1504.9.26 | — | 2 |
| xnu-1504.9.37 | — | 2 |
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.