Skip to content
Syscall BSD#3Introduit dans macOS 10.0 Cheetah

svc · unix #3

read

Lit jusqu'à nbyte octets depuis un descripteur de fichier vers un tampon utilisateur.

Prototype

ssize_t read(int fildes, void *buf, size_t nbyte);

Retour: ssize_t — number of bytes read (0 = EOF), -1 with errno on failure (EAGAIN, EBADF, EINTR, …)

Arguments

NameTypeDirDescription
fildesintinDescripteur de fichier ouvert (fichier régulier, socket, pipe, périphérique, kqueue, …).
bufvoid *outTampon possédé par l'appelant d'au moins nbyte octets.
nbytesize_tinNombre maximum d'octets à lire. Plafonné à INT_MAX sur macOS.

Historique des versions

Absent de toute version XNU publiée.

Stub utilisateur

arm64

; libsystem_kernel.dylib: _read
mov     x16, #3         ; SYS_read
svc     #0x80
b.cs    __cerror
ret

x86_64

mov     eax, 0x2000003  ; SYSCALL_CLASS_UNIX | 3
syscall
jb      __cerror
ret

Exemples

C — read with retry on EINTR

ssize_t n;
do { n = read(fd, buf, sizeof buf); } while (n < 0 && errno == EINTR);

Notes

read(2) est dispatchée par sys_read dans bsd/kern/sys_generic.c, qui récupère le fileproc via le fd, copie jusqu'à nbyte octets via le vecteur fo_read propre au type de fichier, et retourne le nombre écrit. Les fd non-bloquants retournent -EAGAIN immédiatement si rien n'est prêt.

Détection

ES_EVENT_TYPE_NOTIFY_READDIR couvre les lectures de répertoires ; les lectures de fichiers ne sont pas un événement ES de premier ordre, la détection passe donc par KAUTH ou la probe DTrace syscall::read:entry.

Utilisation par les malwares

Utilisée partout — n'est distinctive que lorsque combinée avec des descripteurs provenant de sources suspectes (/dev/urandom pour initialiser un flux, /Library/Keychains/* pour le vol d'identifiants).

API associées

readvpreadread_nocancelrecvkevent

MITRE ATT&CK

Dernière vérification: 2026-05-25