Maison > développement back-end > Golang > le corps du texte

Comment résoudre les erreurs « Argument invalide » lors de l'implémentation de « ioctl() » dans Go ?

Barbara Streisand
Libérer: 2024-11-21 17:22:11
original
917 Les gens l'ont consulté

How to Resolve

Implémentation d'IOCTL dans Go

Question :

Dans la traduction du code C impliquant ioctl() to Go, un problème survient lors de la conversion du code C suivant :

#define MAJOR_NUM 100
#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *)
static int mbox_property(int file_desc, void *buf){
   int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf);
   return ret_val;
}
Copier après la connexion

Le Go correspondant code :

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

}

func Ioctl(fd, op, arg uintptr) error {
        _, _, ep := syscall.Syscall(syscall.SYS_IOCTL, fd, op, arg)
        if ep != 0 {
                return syscall.Errno(ep)
        }
        return nil
}

func IOWR(t, nr, size uintptr) uintptr {
        return IOC(IocRead|IocWrite, t, nr, size)
}
func IOC(dir, t, nr, size uintptr) uintptr {
        return (dir << IocDirshift) | (t << IocTypeshift) | (nr << IocNrshift) | (size << IocSizeshift)
}
Copier après la connexion

provoque une erreur "argument invalide". Quel est le problème potentiel et comment peut-il être résolu ?

Réponse :

Pour résoudre le problème, considérez ce qui suit :

  • Utilisez des wrappers pour ioctl() dans "golang.org/x/sys/unix". En particulier, unix.IoctlSetInt pourrait convenir à votre cas d'utilisation.
  • Faites preuve de prudence lorsque vous transmettez de petits tampons de mémoire au noyau. Le garbage collector de Go peut libérer les objets qu'il juge inutilisés, et potentiellement les déplacer également. Cela peut créer des écarts entre les opérations du noyau et les attentes du code Go.
  • Envisager d'écrire une extension modeste en utilisant cgo vers malloc() un tampon approprié et de le transmettre à ioctl. La mémoire allouée via malloc() n'est pas soumise au garbage collection, atténuant ainsi les problèmes susmentionnés.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal