Maison >développement back-end >Golang >Comment résoudre les erreurs « Argument invalide » lors de l'implémentation de « ioctl() » dans Go ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-21 17:22:111013parcourir

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

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

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!

Déclaration:
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