有効な読み込み用ストリームのファイルディスクリプタfdがあり、これは、ファイルであるか、ソケットであるか、パイプであるか分かりません。
このとき、fdに対して、peek操作(一文字読み込むが、ストリームの位置は変えない)を実行することは可能でしょうか?
> fdに対して、peek操作(一文字読み込むが、ストリームの位置は変えない)を実行することは可能でしょうか?
結論から言うとファイルディスクリプタ「だけ」では無理です。
何故ならファイルディスクリプタに対してread(2)してしまった時点でストリーム位置が変更されてしまい、
その後、一部のファイルはlseek(2)を使って戻すことはできますが、ソケット、パイプは戻せません
# 一部のファイルとはテープデバイスとかのseekが面倒なデバイスです
この場合のpeekの実装方法ですが、fdopen(3C)でファイルディスクリプタから
ファイルストリームを生成して、
fgetc(3C), ungetc(3C)を行えばファイルストリーム上の位置を変えずにデータの読み出しは可能です
# でも、ファイルディスクリプタの位置は変更されます
なので、以降の処理はファイルストリームに対して読み書きを行う必要があり、
うっかりファイルディスクリプタに対して読み書きを行うとおかしなことになります。