Comprendre Syscall.RawSyscall() et Syscall.Syscall() dans Go
Pour les nouveaux utilisateurs du package syscall de Go, le Syscall.RawSyscall () et les fonctions Syscall.Syscall() peuvent être intimidantes. Voici un aperçu détaillé pour clarifier leurs nuances :
Syscall.RawSyscall()
Paramètres :
Valeurs de retour :
Implémentation du code assembleur :
Pour les systèmes Darwin/amd64, le code assembleur pour Syscall.RawSyscall() peut être trouvé ici : https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall
Syscall.Syscall()
Syscall.Syscall () diffère de Syscall.RawSyscall() uniquement en appelant les fonctions runtime.entersyscall() et runtime.exitsyscall() avant et après l'exécution de l'appel système. Cela permet au runtime Go de suivre et de contrôler l'utilisation des appels système par la goroutine.
Utilisation :
Syscall.Syscall() doit généralement être utilisé à la place de Syscall.RawSyscall. () dans la plupart des cas. Syscall.Syscall() gère le changement de contexte Goroutine, permettant la préemption et le multitâche. Utilisez uniquement Syscall.RawSyscall() si vous avez un besoin spécifique de contourner le mécanisme de changement de contexte d'exécution.
Exemple :
Pour écrire votre propre fonction syscall, une approche est :
Cet exemple nécessite cependant une connaissance approfondie de la programmation en assembleur et au niveau du système. détails, il est donc recommandé d'utiliser Syscall.Syscall() autant que possible.
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!