转至Go Binary Hacks – syscall和golang.org/x/sys/ #golang
首先
Go语言提供了syscall包来执行操作系统的系统调用。
而且还存在一个用于执行系统调用的官方外部存储库,即golang.org/x/sys/存储库。
我将解释这两个软件包的产生过程,同时概述系统调用的问题点。
Go 的 syscall 包存在的问题。
-
- 每个操作系统都有很多系统调用和变量定义。而且这些调用和定义还在不断增长。
-
- 测试每个操作系统不同规范的系统调用是困难的。
-
- 整理每个操作系统不同规范的系统调用的文档也是困难的。
-
- 每个操作系统都有很多系统调用的更改请求,判断是否应该采纳这些更改是很耗费成本的。
- 即使Go语言不变,操作系统的变化也会导致保持Go的兼容性变得困难。
对于Go1.4及更高版本的syscall包的支持。
syscallパッケージでは、Goの将来のバージョンをサポートするために必要な変更だけが取り込まれます。それ以外の変更はsyscallパッケージには取り込まれません。
syscallパッケージは、下位バージョンとの互換性を維持する必要があるため、なくなることはありません。
OS固有の変更は、Goの標準ライブラリからは独立したgolang.org/x/sys/で管理されます。
パッケージを分割することで、OS固有のドキュメント、テスト、変更の追従ができるようになりました。
golang.org/x/sys/には、plan9, windows, unixなどOSごとにパッケージが別れており、それぞれ独立して変更が管理されます。
このパッケージはシステム間の基本的なインターフェースの違いを表現しており、厳密にOSごとに分離されているわけではありません。
unixパッケージではLinuxとdarwinが対象となっており、ビルドタグによってビルド対象を切り替えます。
Linuxとdarwinでは完全にシステムコールの仕様が同一ではないので完全な移植性は実現できないはずです。
Goの標準ライブラリはこのパッケージには依存しません。
Goチームによって管理されます。
总结
使用系统调用这种方式的话,不能保证移植性,所以建议你使用golang.org/x/sys/。
虽然如此,根据我认为,从Go的标准库中使用的syscall包的系统调用应该有一定的移植性,所以你可以根据所使用的系统调用的功能进行选择性使用。
请参考
- The syscall package