Maison >développement back-end >Golang >## En quoi `syscall.RawSyscall()` et `syscall.Syscall()` diffèrent dans Go, et quand devez-vous les utiliser chacun ?
Le La fonction Syscall.RawSyscall() dans Go prend quatre paramètres de type uintptr :
Il renvoie deux valeurs uintptr, r1 et r2, et une valeur Errno :
L'implémentation de l'assembly de RawSyscall( ) pour darwin/amd64 peut être trouvé sur le lien suivant :
[https://golang.org/src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall](https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall)
Les lignes 61 à 80 de ce fichier contiennent le code assembleur suivant :
<code class="assembly">61 TEXT ·RawSyscall(SB),7, 62 MOVQ 16(SP), DI 63 MOVQ 24(SP), SI 64 MOVQ 32(SP), DX 65 MOVQ , R10 66 MOVQ , R8 67 MOVQ , R9 68 MOVQ 8(SP), AX // syscall entry 69 ADDQ x2000000, AX 70 SYSCALL 71 JCC ok1 72 MOVQ $-1, 40(SP) // r1 73 MOVQ , 48(SP) // r2 74 MOVQ AX, 56(SP) // errno 75 RET 76 ok1: 77 MOVQ AX, 40(SP) // r1 78 MOVQ DX, 48(SP) // r2 79 MOVQ , 56(SP) // errno 80 RET</code>
Ce code effectue essentiellement les opérations suivantes tâches :
Le préfixe "z" dans le nom de fichier zsyscall_darwin_amd64.go indique qu'il contient des wrappers d'appel système pour les processus non privilégiés. Ces wrappers gèrent des tâches supplémentaires telles que le passage à un autre utilisateur ou ID de thread avant d'exécuter l'appel système.
La principale différence entre Syscall() et RawSyscall() () est que Syscall() appelle runtime.entersyscall(SB) et runtime.exitsyscall(SB) avant et après l'exécution de l'appel système, respectivement. Ces fonctions permettent au système d'exécution de suivre l'état de blocage des goroutines. RawSyscall(), en revanche, n'effectue pas ces appels, il n'interagit donc pas avec le système d'exécution de la même manière.
Syscall() est généralement utilisé lorsque vous disposez d'un numéro d'appel système spécifique et d'arguments que vous souhaitez appeler directement. RawSyscall() est utile lorsque vous souhaitez plus de contrôle sur l'exécution de l'appel système, par exemple lorsque vous devez appeler un appel système qui n'est pas exposé par le package os ou lorsque vous devez gérer manuellement l'état de blocage de l'appel système.
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!