Go の Syscall.RawSyscall() と Syscall.Syscall() について
Go の syscall パッケージを初めて使用する方のために、Syscall.RawSyscall () 関数と Syscall.Syscall() 関数は、気が遠くなる可能性があります。ニュアンスを明確にするために、詳細な概要を次に示します。
Syscall.RawSyscall()
パラメータ:
戻り値:
アセンブリ コードの実装:
Darwin/amd64 システムの場合、Syscall.RawSyscall() のアセンブリ コードはここにあります: https://golang.org /src/pkg/syscall/asm_darwin_amd64.s?h=RawSyscall
Syscall.Syscall()
Syscall.Syscall () は、システム コールの実行前後に runtime.entersyscall() 関数と runtime.exitsyscall() 関数を呼び出す点だけが Syscall.RawSyscall() と異なります。これにより、Go ランタイムは goroutine によるシステム コールの使用を追跡および制御できるようになります。
使用法:
通常、Syscall.RawSyscall の代わりに Syscall.Syscall() を使用する必要があります。 () ほとんどの目的に使用できます。 Syscall.Syscall() は、Goroutine コンテキストの切り替えを処理し、プリエンプションとマルチタスクを有効にします。ランタイム コンテキスト切り替えメカニズムをバイパスする特別な必要がある場合にのみ、Syscall.RawSyscall() を使用してください。
例:
独自の syscall 関数を作成するには、1 つの方法があります。
ただし、この例では、アセンブリ プログラミングとシステム レベルの深い知識が必要です。そのため、可能な限り Syscall.Syscall() を使用することをお勧めします。
以上がGo の `Syscall.RawSyscall()` と `Syscall.Syscall()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。