豫言操作系统底层句柄〇点一点〇
状:草案。汉语本见汉语版。通用之规,见[调用约定](../调用约定.文言.md);状态之码表,见[底层基础](../底层基础/规范.文言.md)。
范围
柄之通用操作:读、写、定位读写、寻址、同步、设长度、设非阻塞、等待、建管道,及枚举初始授权与询类别。文件、套接字、终端、进程之柄,皆用此中函数以收发数据;其打开、连接、启动之函数,则在各自之包。本包依底层基础(状态之码)。
柄之模
- 柄乃非负整数,平台颁之;零、一、二恒为标准入、出、误;负一为无效;既闭,其号或复用。
- 初始柄表:启动时平台所授之余柄(预开之目录等),以
取初始句柄按序号(自零起)枚举,每项给类别、柄与名(预开目录之名,乃客体所见之路径,如/)。此为程序得授权之唯一来源。 - 类别(
取句柄类别):0 未知、1 普通文件、2 目录、3 终端、4 他字符设备、5 管道、6 套接字、7 进程。 - 诸函数遇不适之类别则返 28(参数无效):如对目录
读,对管道寻址(返 70,不可寻址)。
句柄(句柄。接口。豫)
| 函数 | 参 | 用 | | --- | --- | --- | | 取初始句柄 | 序号, 类别出, 句柄出, 名缓冲址, 名缓冲长, 名总长出 | 出类别、柄各四字节;名书于名缓冲,名之总长四字节;序号越界返 44;名缓冲不足返 61 | | 取句柄类别 | 句柄, 出 | 类别四字节 | | 读 | 句柄, 缓冲址, 长, 出 | 至多读「长」字节;已读之数四字节,零为文件尾;非阻塞之柄无数据返 6;终端行模按行送达,换行符亦在所读字节中,空行故至少得一字节;缓冲短于一行则余字待后读;长为零则不耗输入 | | 写 | 句柄, 址, 长, 出 | 已写之数四字节,可短写;读端已闭之管道返 64 | | 定位读 | 句柄, 缓冲址, 长, 偏移低, 偏移高, 出 | 不易当前之位;不可寻址之柄返 70 | | 定位写 | 句柄, 址, 长, 偏移低, 偏移高, 出 | 同上 | | 寻址 | 句柄, 偏移低, 偏移高, 起点, 出 | 起点 0 始、1 今、2 末;新位八字节;不可寻址返 70 | | 关闭 | 句柄 | 其后此号失效 | | 同步 | 句柄, 标志 | 标志 1 谓仅同步数据;不可同步之柄返 28 | | 设长度 | 句柄, 低, 高 | 截或扩普通文件;余类返 28 | | 设非阻塞 | 句柄, 开关 | 开关 1 置为非阻塞,0 复其阻塞 | | 建管道 | 读端出, 写端出 | 二端各得一柄(各四字节);诸写端皆闭,则读端读得 0 |
等待(等待。接口。豫)
| 函数 | 参 | 用 | | --- | --- | --- | | 等待 | 订阅址, 订阅数, 事件址, 出 | 阻塞至少有一事;事书于事件址,事之个数(四字节)书于出址;订阅数为零则返 28 |
订(十六字节):
| 偏移 | 宽 | 字段 | | --- | --- | --- | | 0 | 4 | 类别:1 钟、2 可读、3 可写 | | 4 | 4 | 柄(钟类略之) | | 8 | 8 | 超时纳秒(唯钟类,相对当前之刻) |
事(十六字节):
| 偏移 | 宽 | 字段 | | --- | --- | --- | | 0 | 4 | 订之序号,即其于数组中之下标 | | 4 | 4 | 状态之码:零,或其柄出误之码(如 8) | | 8 | 4 | 类别,同订 | | 12 | 4 | 可用之字节数(可读类,逾三十二位则取其极;余为零) |
规:钟订至时即报;可读之订,柄有数据或已至文件尾(是时可用之字节数为零)则报;可写之订,写而不阻则报;无钟订而无柄就绪,则久阻。无柄之订而唯有钟订,即睡眠。首版保四类之物可候:文件(恒就绪)、终端、管道、套接字与进程(进程可读即已退)。
平台之注
- 裸机:零、一、二为控制台;管道乃执行器内之内存物;候钟用内核滴答(精度十毫秒),候邮箱与终端之入,靠内核服务之轮询;文件之柄,由执行器内之文件系统供之(见[底层文件](../底层文件/规范.文言.md))。
- 桌面:柄乃文件描述符(Linux、macOS)或 HANDLE(Windows)之上一层编号;
等待落于 ppoll、kevent 或 WaitForMultipleObjects,此诸后端中最难齐一之处,首版唯承上述四类之物。