I/O 函数

本章描述了用于执行系统访问、普通文件 I/O 和套接字(网络)I/O 等操作的 NSPR 函数。

有关说明基本 I/O 操作的示例代码,请参阅 Introduction_to_NSPR>。有关本章中描述的函数最常用类型的信息,请参阅 I/O 类型

操作路径名的函数

文件系统中的文件或目录由其路径名指定。NSPR 使用 Unix 风格的路径名,它们是空终止的字符字符串。仅支持 ASCII 字符集。正斜杠 (/) 分隔路径名中的目录。NSPR 将路径名中的斜杠转换为本机操作系统的目录分隔符(例如,Windows 上的反斜杠 () 和 Mac OS 上的冒号 (:)),然后再将其传递给本机系统调用。

某些文件系统还区分驱动器或卷。

作用于文件描述符的函数

目录 I/O 函数

套接字操作函数

此处提供的网络编程接口是根据流行的 Berkeley 套接字建模的套接字 API。差异包括以下内容

  • NSPR 中的阻塞套接字函数采用超时参数。

  • 两个新函数,PR_TransmitFilePR_AcceptRead,可以利用某些操作系统的新的系统调用来提高性能。

函数列表

主机地址和网络地址之间的转换

内存映射 I/O 函数

内存映射 I/O 函数允许将文件的部分映射到内存区域,从而可以通过正常的内存访问来完成对文件的读写访问。

内存映射 I/O 函数目前仅在 Unix、Linux、Mac OS X 和 Win32 上实现。

匿名管道函数

轮询函数

本节描述了 NSPR 提供的两个最重要的轮询函数

可轮询事件

可轮询事件是一种特殊类型的文件描述符。您可以在可轮询事件上执行的唯一 I/O 操作是使用 PR_POLL_READ 标志对其进行轮询。您无法从可轮询事件读取或写入。

可轮询事件的目的是在一个 PR_Poll 调用中将事件等待与 I/O 等待结合起来。可轮询事件使用管道或通过环回地址连接的一对 TCP 套接字实现,因此设置和/或等待可轮询事件是昂贵的操作系统调用。不要将可轮询事件用于一般的线程同步;请改用条件变量。

可轮询事件有两种状态:设置和未设置。事件不会排队,因此没有事件计数的概念。可轮询事件要么设置,要么未设置。

可以使用 PR_POLL_READ 标志在可轮询事件上调用 PR_Poll。当可轮询事件被设置时,PR_Poll 返回在 out_flags 中设置的 PR_POLL_READ 标志。

操作层

文件描述符可以分层。例如,SSL 是可靠字节流层(如 TCP)之上的一个层。

每种类型的层都有一个唯一的标识,由运行时分配。层实现者应将标识与该类型的所有层关联起来。然后可以扫描层链并找到识别出的层,从而预测它将实现所需的协议。

可以将层推送到或从现有的层堆栈中弹出。可以将顶层的文件描述符传递给 NSPR I/O 函数,这些函数将以多态方式调用 I/O 方法的相应版本。

NSPR 定义了三个标识

#define PR_INVALID_IO_LAYER (PRDescIdentity)-1
#define PR_TOP_IO_LAYER (PRDescIdentity)-2
#define PR_NSPR_IO_LAYER (PRDescIdentity)0
  • PR_INVALID_IO_LAYER:无效的层标识(用于错误返回)。

  • PR_TOP_IO_LAYER:堆栈顶部的标识。

  • PR_NSPR_IO_LAYER:NSPR 实现的层的标识。

PR_TOP_IO_LAYER 可用作识别现有堆栈的最顶层层的简写。例如,以下代码行是等效的

rv = PR_PushIOLayer(stack, PR_TOP_IO_LAYER, my_layer);
rv = PR_PushIOLayer(stack, PR_GetLayersIdentity(stack), my_layer);