ucontext.hはなぜPOSIXから廃止されたか
基本的に大抵のLinuxやBSD、CygwinはPOSIXに概ね準拠しているということになっている。今のところ最新のPOSIXはIssue 7(2008年 - 2013年が最新のedit)で、これはIssue 6からいくつかAPIを削減している(STREAMSのようにせっかく標準になったのに速攻でOBSOLETEになったものもある)。
削減されたヘッダは:
- ucontext.h
- sys/timeb.h
( http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap13.html )
... timeb.hは別に消えても良いと思うけど ftime() APIを定義していた。
ucontext.hはインタプリタ業としてはよく使うヘッダだが、Rationaleを見ると
- getcontext(), makecontext(), swapcontext()
Due to portability issues with these functions, especially with the manipulation of contexts, applications are recommended to be rewritten to use POSIX threads.
なんてこった。
まぁ、移植性がないというのはその通り。ただ、現実的なPOSIX風OSは大抵ucontextを引き続きサポートしている。ucontextはpthreadオブジェクトと異なり解放手続きを定義していないためABI互換を保ちながらCPUコンテキストを拡張するのが困難であり、バイナリ互換性を担保する上では難しいインターフェースになっている。解放手続きが存在すれば、ucontext_tはpthread_tと同様ハンドルとして抽象化することができる。
ヘッダの削除以外に、vfork()やusleep()のような有名APIも削除している。
システムコールやカーネル共有部分の取り扱い
Machine specificな部分をどうしても残さざるを得ないucontext.hが廃止されるのは良いとして、現状のPOSIXにはいわゆるsystem callインターフェースもそれなりに残っている。POSIXは別にAPIをシステムコールで実装することは求めていない(寧ろ明確に区別している - http://pubs.opengroup.org/onlinepubs/9699919799/frontmatter/preface.html "Interface, Not Implementation")が、UNIX伝統として元々system callであったものをAPIにしているので、ヘッダにその痕跡がそれなりに有る。
POSIX標準ヘッダでsys/以下に配置されているのは:
- sys/ipc.h
- sys/mman.h
- sys/msg.h
- sys/resource.h
- sys/select.h
- sys/sem.h
- sys/shm.h
- sys/socket.h
- sys/stat.h
- sys/statvfs.h
- sys/time.h
- sys/times.h
- sys/types.h
- sys/uio.h
- sys/un.h
- sys/utsname.h
- sys/wait.h
まぁ、カーネルと型を共有したいという需要は有るのかもしれないが、sys/types.hはpthreadの型とかも入っているのでなんというか明確に分離されていない感がある。
Linuxのようにカーネルとlibcの実装が分割されているシステムでは、カーネル側のヘッダはlinux/以下に分離されている(つまりsys/はカーネルを含意しない)。libcとカーネルを分離していない各種BSDではsys/以下のヘッダは普通にカーネルと共有している。CygwinのようなNewlibベースのシステムでは、machine/以下に機種依存部を分ける他は思い思いの実装になっている。。