Maison >développement back-end >Golang >Comment puis-je utiliser en toute sécurité ioctl() dans Go sans fuite de mémoire ?
Utilisation appropriée d'Ioctl dans Go
Dans Go, l'appel ioctl() est effectué via la fonction Syscall() du package non sécurisé. Cela apporte un niveau de complexité considérable à la tâche, par rapport à la programmation C.
L'équivalent Go du code C fourni, appelant ioctl() sur le descripteur de fichier f avec l'opération IOCTL_MBOX_PROPERTY et le tampon buf :
func mBoxProperty(f *os.File, buf [256]int64) { err := Ioctl(f.Fd(), IOWR(100, 0, 8), uintptr(unsafe.Pointer(&buf[0]))) if err != nil { log.Fatalln("mBoxProperty() : ", err) } }
En tant que tel, Ioctl() est une fonction qui enveloppe Syscall() avec une interface prédéfinie qui simplifie la tâche de création d'ioctl() appels dans Go. Les erreurs rencontrées lors de l'appel ioctl() sont renvoyées sous la forme syscall.Errno.
Il est important d'empêcher le garbage collector de libérer la mémoire pointée par buf avant la fin de l'appel ioctl(). Cela peut être fait en garantissant que buf reste dans la portée jusqu'à l'appel à ioctl(), ce qui peut être réalisé en déclarant buf comme variable locale dans la fonction. Alternativement, runtime.KeepAlive(buf) peut être utilisé pour empêcher le ramasse-miettes de libérer le tampon.
Dans les cas où le noyau s'attend à ce qu'un petit tampon mémoire soit remis, il est crucial de faire preuve de prudence. Le garbage collector peut libérer des objets en mémoire qui, selon lui, ne sont pas utilisés, ou même les déplacer en mémoire. Ces actions restent invisibles pour le noyau, qui conserve l'ancien pointeur et continue de l'utiliser.
Pour atténuer ce problème, une petite extension C écrite en utilisant cgo peut être utilisée pour allouer un tampon approprié via malloc(), qui n'est pas soumis à la collecte des déchets. Ce tampon peut ensuite être transmis à ioctl(). En suivant l'ancienne valeur du pointeur et en la libérant après utilisation, les fuites de mémoire peuvent être évitées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!