查看源码 内核发布说明
本文档描述了对 Kernel 应用程序所做的更改。
Kernel 10.2
修复的错误和故障
gen_sctp:peeloff/2
已修复,可以更像gen_tcp:accept/1
一样,将套接字选项继承到剥离的套接字,例如选项tos
或tclass
。当设置平台上不支持的 SCTP 选项时,应该静默忽略某些选项,但是一个错误导致选项解析脱轨,因此之后的选项可能会退出并导致错误。此问题已修复。
自有 ID: OTP-19225 辅助 ID: PR-8789
可以通过再次按 ^[h 来展开按 ^[h 显示的帮助文本。
自有 ID: OTP-19260 辅助 ID: PR-8884
当使用 inet_backend = socket 时,
inet:getifaddrs/0,1
得到了改进。自有 ID: OTP-19264
修复了
logger:report/0
,强制报告中至少包含一个元素。这修复了在使用logger:report/0
的所有logger
函数中,重叠的spec
域的问题。自有 ID: OTP-19302 辅助 ID: PR-8959
修复了
code_server
上的死锁。多个调用加载同一个带有on_load
函数加载调用的模块将导致死锁。
改进和新功能
Kernel 应用程序现在可以识别
epmd_module
和erl_epmd_listen_port
参数,类似于-kernel:connect_all
。自有 ID: OTP-19253 辅助 ID: PR-8671
inetrc
内核参数现在将再次容忍原子,以提高与偶然依赖于原子工作的旧配置的兼容性。预期的类型始终是,并且仍然是,一个字符串。
file:io_device/0
类型已更新,以清楚地显示raw
和cooked
IoDevice 之间的区别。自有 ID: OTP-19301 辅助 ID: PR-8956
Erlang/OTP 类型规范已更新,以消除重叠的域。
添加了内核参数
os_cmd_shell
,该参数控制os:cmd/1
应使用的 shell。自有 ID: OTP-19342 辅助 ID: PR-8972
为
io:user/0
、io:standard_io/0
和io:standard_error/0
添加了日志记录支持。 有关更多详细信息,请参阅io:setopts/2
。自有 ID: OTP-19372 辅助 ID: PR-8947
Kernel 10.1.2
修复的错误和故障
在 Windows 上,即使并非所有数据都已读取,socket:recv 也可以成功返回 ({ok, Data})。
自有 ID: OTP-19328
domain local 上的 gen_udp:send 可能会泄漏 inet_reply 消息。
自有 ID: OTP-19332 辅助 ID: #8989
当 inet_backend = socket 并使用某些 IPv6 套接字选项时,无法创建 UDP IPv6 套接字。
自有 ID: OTP-19357
net:getifaddrs 在 Windows 上无法正确报告运行标志。
自有 ID: OTP-19366 辅助 ID: OTP-19061, ERIERL-1134
Kernel 10.1.1
修复的错误和故障
修复了一个错误,其中使用
gen_sctp
接收 SCTP 消息可能会浪费消息的第一个片段,而只传递最后一个片段。当操作系统发出套接字已准备好进行读取的信号,并结合内部超时重试时,会发生这种情况,概率较低。
修复了一个错误,该错误是来自 SCTP 连接之后的一个持续超时,可能会阻止活动
gen_tcp
套接字上流入的消息流。自有 ID: OTP-19235 辅助 ID: ERIERL-1133, PR-8837
为 SCTP 添加了一个布尔选项
non_block_send
,以便能够实现旧的行为,通过传递操作系统网络堆栈错误消息 ({error,eagain}
) 来避免阻塞发送操作。自有 ID: OTP-19258 辅助 ID: OTP-19061, ERIERL-1134
Kernel 10.1
修复的错误和故障
更正了
prim_tty
模块中的一个错误断言。当从 stdin 读取无效的 UTF-8,并且模式从 unicode 更改为 latin1 时,可能会触发此断言。自有 ID: OTP-19097 辅助 ID: PR-8503
打开
disk_log
文件并将head_func
与rotate
选项组合使用不起作用。自有 ID: OTP-19104 辅助 ID: ERIERL-870
修复了非本地 pid 上
erlang:is_process_alive/1
的错误信息输出。自有 ID: OTP-19134 辅助 ID: PR-8560
修复了 SSL 分发的 kTLS 风格中的一个竞争条件,以便
inet_drv.c
不会预读太多数据,这可能会导致在某些加密数据作为未加密数据已读取到inet_drv.c
缓冲区中时,过晚激活 kTLS 加密。修复了应用程序在启动期间崩溃并且日志消息发送到标准输出时发生的死锁。Logger 将无法将消息打印到标准输出,而是将其打印到标准错误。
自有 ID: OTP-19205
多次指定
-proto_dist
初始化参数时,将不再忽略该参数。现在它将记录一个警告并使用第一个指定的值。自有 ID: OTP-19208 辅助 ID: PR-8672
更正了 genaddr (SIOCGENADDR) 的 socket:ioctl。
自有 ID: OTP-19216
改进和新功能
将函数
getservbyname
和getservbyport
添加到net
模块。自有 ID: OTP-19101 辅助 ID: OTP-18835
引入了
inet
函数的 enet | esock 变体,或者当使用套接字调用时,或者使用显式的 inet_backend 配置或 e inet_backend 内核配置选项调用时。自有 ID: OTP-19132 辅助 ID: OTP-19101
函数
socket:i/0
现在使用net
模块(而不是inet
模块)进行服务转换。自有 ID: OTP-19138 辅助 ID: OTP-19101
为
gen_tcp
实现了一个布尔选项read_ahead
,默认值为true
,以方便不读取超过(缓存数据)数据包末尾的数据。 特别是对于 kTLS,缓存数据可能会在加密参数激活之前读取本应由平台的网络堆栈解密的数据。自有 ID: OTP-19199 辅助 ID: OTP-19175, GH-8561, GH-8690, GH-8785
Kernel 10.0.1
改进和新功能
Kernel 10.0
修复的错误和故障
修复了使用空选项列表调用
file:delete/2
时发生的崩溃。自有 ID: OTP-18590 辅助 ID: PR-7220
新的函数已添加到未文档化的模块
m:inet_dns
中,该模块使用一个标志来指定编码/解码是否用于 mDNS。这会影响如何处理私有范围中设置了最高位的 CLASS 值。自有 ID: OTP-18878 辅助 ID: GH-7718, OTP-17734
更正了
erlang:phash/2
的错误信息。自有 ID: OTP-18904 辅助 ID: PR-7960
当
eof
是回调返回的最后一项时,使用 I/O 协议的get_until
请求现在会正确返回二进制或列表。使用配置选项调用
logger:add_handlers/1
现在可以工作。code:del_path/1
函数现在也适用于通过-pa
、-pz
、-path
和启动脚本添加的路径。如果在 Windows 上数据立即可用,使用 Timeout = 0 调用
socket:[recv|recvfrom|recvmsg]/*
可能会导致(case clause)崩溃。自有 ID: OTP-19063 辅助 ID: OTP-18835
改进了在具有旧 libc 版本的系统中 shell 中字符为宽字符时的启发式方法。
自有 ID:OTP-19087 辅助 ID:PR-8382
修复了从
io:user/0
读取行时,当erl
使用-noshell
启动时,不将没有\n
的\r
视为新行的问题。
改进和新功能
添加了带有
raw
选项的file:read_file/2
,用于读取文件而不经过文件服务器。自有 ID:OTP-18589 辅助 ID:PR-7220
未记录的 Erlang DNS 解析器库(
inet_dns
和inet_res
)已增强,可以处理 IXFR、NOTIFY、UPDATE 和 TSIG 记录。与此同时,还进行了一些错误修复和代码清理,并且测试套件中使用的解析器已更改为 Knot DNS。请参阅源代码。感谢 Alexander Clouter 完成了几乎所有工作!
现在缓存 escript 的
ebin
目录。自有 ID:OTP-18778 辅助 ID:PR-7556
已经将
-callback
属性添加到了application
、logger_handler
和logger_formatter
。自有 ID:OTP-18795 辅助 ID:PR-7703
现在,当日志级别设置为 debug 时,会记录在 logger 启动之前产生的进度报告。
自有 ID:OTP-18807 辅助 ID:PR-7732 ERIERL-985
code:where_is_file/2
和code:which/1
函数现在直接检查文件是否存在,而不是列出代码路径中每个目录的内容。自有 ID:OTP-18816 辅助 ID:PR-7711
已将类型规范添加到
logger:Level/1,2,3
函数。自有 ID:OTP-18820 辅助 ID:PR-7779
对于
inet_backend = socket
,单独将active
套接字选项设置为once
、true
或N
进行了优化,以及相应的数据传递。自有 ID:OTP-18835
添加了用于发送 I/O 向量的新函数
socket:sendv/*
。自有 ID:OTP-18845
现在,shell 会对文档帮助命令(
h(Module)
)、自动完成和搜索命令产生的长输出进行分页。自有 ID:OTP-18846 辅助 ID:PR-7845
JIT 中已实现了原生覆盖率支持。 当运行覆盖率编译的代码时,它将自动被
cover
工具使用,以减少执行开销。还有新的 API 可用于支持不使用
cover
工具的原生覆盖率。要为原生覆盖率检测代码,必须使用
line_coverage
选项进行编译。要在运行时系统中启用原生覆盖率,请按以下方式启动它
$ erl +JPcover true
还有以下新函数用于支持原生覆盖率
code:coverage_support/0
code:get_coverage/2
code:reset_coverage/1
code:get_coverage_mode/0
code:get_coverage_mode/1
code:set_coverage_mode/1
自有 ID:OTP-18856 辅助 ID:PR-7856
通过将某些操作从代码服务器移动到调用方,优化了代码加载。
自有 ID:OTP-18941 辅助 ID:PR-7981
文档已迁移为使用 Markdown 和 ExDoc。
自有 ID:OTP-18955 辅助 ID:PR-8026
通过删除中间进程优化了应用程序启动。
自有 ID:OTP-18963 辅助 ID:PR-8042
对归档文件的现有实验性支持将在未来的版本中更改。在 escript 中使用归档文件的支持将保留,但在版本中使用归档文件的支持将受到更多限制或完全删除。
从 Erlang/OTP 27 开始,函数
code:lib_dir/2
、-code_path_choice
标志,以及使用erl_prim_loader
读取归档文件的成员都已被弃用。为了与未来版本的 Erlang/OTP 保持兼容,需要从其归档文件中检索数据文件的
escript
脚本应使用escript:extract/2
而不是erl_prim_loader
和code:lib_dir/2
。潜在的不兼容性
自有 ID:OTP-18966 辅助 ID:PR-8091
已删除未记录且已弃用的
file:pid2name
函数。自有 ID:OTP-18967 辅助 ID:PR-8092
Kernel 中有一个新的模块
trace
,它提供的跟踪功能与erlang:trace/3
和erlang:trace_pattern/3
相同,但增加了动态隔离的跟踪会话。自有 ID:OTP-18980
当
io:standard_io/0
读取器和/或写入器因错误而终止时,错误日志记录已得到改进。自有 ID:OTP-18989 辅助 ID:PR-8103
inet_backend = socket
已被优化和重构,以使其与原始的inet_backend = inet
更加兼容。自有 ID:OTP-19004 辅助 ID:OTP-18835
在套接字用户指南中添加了一个简单的示例(回声服务器)。
自有 ID:OTP-19042
inet:i/0,1,2
已得到改进,允许显式显示端口号。自有 ID:OTP-19053 辅助 ID:#6724
socket
文档已重构,因此修复了一些细节- 例如,
socket:is_supported/1
现在对属于“类别”而不是项目的protocols
返回true
。 - 对于由另一个进程设置的监视器,
socket:cancel_monitor/1
不再返回 badargs,而是像其他未知reference()
一样返回false
。
自有 ID:OTP-19054
- 例如,
将
stdin
、stdout
和stderr
键添加到io:getopts/1
的io:standard_io/0
中,以指示相应的 I/O 设备是否由终端支持。自有 ID:OTP-19089 辅助 ID:PR-8396
Kernel 9.2.4.4
已修复的错误和故障
domain local 上的 gen_udp:send 可能会泄漏 inet_reply 消息。
自有 ID:OTP-19332 辅助 ID:#8989
当 inet_backend = socket 并使用某些 IPv6 套接字选项时,无法创建 UDP IPv6 套接字。
自有 ID: OTP-19357
net:getifaddrs 在 Windows 上无法正确报告运行标志。
自有 ID: OTP-19366 辅助 ID: OTP-19061, ERIERL-1134
Kernel 9.2.4.3
已修复的错误和故障
修复了一个错误,即在使用 `gen_sctp` 接收 SCTP 消息时,可能会浪费消息的第一个片段,并且只传递最后一个片段。
当操作系统发出套接字已准备好进行读取的信号,并结合内部超时重试时,会发生这种情况,概率较低。
修复了一个错误,即在 SCTP 连接之后,可能会存在一个挥之不去的超时,这可能会阻止活动的 `gen_tcp` 套接字上的传入消息流。
自有 ID:OTP-19235 辅助 ID:ERIERL-1133, PR-8837
为 SCTP 添加了一个布尔选项 `non_block_send`,以便能够实现旧的行为,即通过操作系统网络堆栈错误消息 (`{error,eagain}`) 来避免阻塞发送操作。
自有 ID: OTP-19258 辅助 ID: OTP-19061, ERIERL-1134
Kernel 9.2.4.2
已修复的错误和故障
修复了 SSL 分布的 kTLS 风味中的竞争条件,使得 inet_drv.c 不会超前读取太多数据,这可能会导致当一些加密数据已经作为未加密数据读取到 inet_drv.c 缓冲区中时,kTLS 加密激活得太晚。
自有 ID:OTP-19175 辅助 ID:GH-8561, PR-8690
修复了在应用程序启动期间崩溃并且日志消息被发送到标准输出时发生的死锁。Logger 无法将消息打印到标准输出,而是将其打印到标准错误。
自有 ID: OTP-19205
添加了 stdlib 应用程序参数
shell_redraw_prompt_on_output
,当设置为false
时,禁用在执行任何其他输出时重绘 shell 提示符。自有 ID:OTP-19213 辅助 ID:PR-8763 ERIERL-1108
Kernel 9.2.4.1
已修复的错误和故障
在 Windows 上,使用 Timeout = 0 调用 socket:[recv|recvfrom|recvmsg]/* 可能会导致(case 子句)崩溃,如果数据立即可用。
自有 ID: OTP-19063 辅助 ID: OTP-18835
打开
disk_log
文件并将head_func
与rotate
选项组合使用不起作用。自有 ID: OTP-19104 辅助 ID: ERIERL-870
Kernel 9.2.4
已修复的错误和故障
修复了 shell 作业控制模式,使其在键入
TAB
或CTRL+R
时不会崩溃。自有 ID:OTP-19072 辅助 ID:PR-8391
修复了对阻塞
application
API 的调用,使其在系统终止时调用时抛出原因terminating
的异常。这样做是为了避免在关闭或重新启动期间发生死锁。
自有 ID:OTP-19078 辅助 ID:PR-8422
Kernel 9.2.3
已修复的错误和故障
当使用 IPv6 时,经典的 gen_udp 未能添加(组)成员资格(而是使用了删除)。
自有 ID:OTP-19049 辅助 ID:#8176
inet_res 中对 RD 位的检查已略微放宽。
自有 ID:OTP-19056 辅助 ID:PR-8312,OTP-17323
Kernel 9.2.2
修复的 Bug 和故障
修复了使用
io:fread
从standard_io
读取时出现的性能 Bug。此回归是在 OTP 26.0 中引入的。自有 ID:OTP-18910 辅助 ID:PR-7933 GH-7924
代码服务器中的一个 Bug 可能导致其在某些并发场景中崩溃。此 Bug 是在 26.1 中引入的。
自有 ID:OTP-18948 辅助 ID:PR-8046
修复了 gen_udp:open/2 类型规范,以包含已支持的模块套接字地址类型。
自有 ID:OTP-18990 辅助 ID:GH-8158
修复了在
user_interactive
模式下 ssh 客户端读取密码的问题。自有 ID:OTP-19007 辅助 ID:ERIERL-1049
Kernel 9.2.1
修复的 Bug 和故障
修复了当检测到
eof
时,get_until
回调函数返回{done, eof, []}
时,group
(即 shell)无法正确处理的问题。自有 ID:OTP-18901
Kernel 9.2
修复的 Bug 和故障
对于
inet_backend = socket
,诸如etimedout
之类的意外接收错误会导致接收状态机服务器崩溃。此 Bug 现已修复。自有 ID:OTP-18749 辅助 ID:GH-7608
修复了使用来自启用 Unicode 的
standard_io
、standard_error
或任何其他group
支持的设备,通过file
读取时,导致返回错误的值或崩溃的 Bug。现在,当使用
file
读取 Unicode 数据时,会向调用者返回 no_translation 错误。有关如何正确从standard_io
读取的更多详细信息,请参阅 STDLIB 用户指南中的使用 Unicode。自有 ID:OTP-18800 辅助 ID:PR-7714 GH-7591
本机解析器接口模块已对其 ETS 表处理进行了重写,以最大程度地减少术语复制,并将客户端超时处理移至客户端,这有助于本机解析器名称服务器在负载过重时避免陷入泥潭。
自有 ID:OTP-18812 辅助 ID:ERIERL-997
将某些文件中有意使用 Apache License 2.0 标头替换了无意的 Erlang Public License 1.1 标头。
自有 ID:OTP-18815 辅助 ID:PR-7780
修复了如果客户端进程既监视组/范围又加入了组,
pg
中的 Bug。此类进程的终止会导致pg
服务器进程崩溃。自有 ID:OTP-18833 辅助 ID:GH-7625,PR-7659
修复了当使用
file:consult
且在读取时底层文件读取返回错误时发生的崩溃。自有 ID:OTP-18873 辅助 ID:PR-7831
更正了 gen_tcp_socket 监听选项处理。
自有 ID:OTP-18883 辅助 ID:#7764
改进和新功能
添加了对 DGRAM 套接字连接的 Windows 支持。
自有 ID:OTP-18762
记录了先前不透明的类型 select_tag() 和 completion_tag()。
自有 ID:OTP-18818 辅助 ID:#7337
Kernel 9.1
修复的 Bug 和故障
修复了模拟器启动失败时崩溃标语被截断的问题。
自有 ID:OTP-18623 辅助 ID:GH-7344
修复了 shell:start_interactive 函数规范。
自有 ID:OTP-18628 辅助 ID:GH-7280
修复了 code:get_doc/1 在无法找到 erts 时返回 missing 而不是崩溃的问题。
自有 ID:OTP-18654 辅助 ID:PR-7404
函数 socket:close/1 可能会导致 Windows 上的 VM 崩溃。
自有 ID:OTP-18669 辅助 ID:OTP-18029
修复了在 Windows 上将
erl.exe
用作管道的一部分并尝试设置standard_io
设备的编码时发生的死锁。自有 ID:OTP-18675 辅助 ID:PR-7473 GH-7459
扩展了有关如何使用
standard_io
、standard_error
和user
I/O 设备的文档。添加了类型
io:standard_io/0
、io:standard:error/0
和io:user/0
。自有 ID:OTP-18676 辅助 ID:PR-7473 GH-7459
修复了 logger 的过载保护机制,以便仅在需要时获取消息使用的内存。
自有 ID:OTP-18677 辅助 ID:PR-7418 GH-7417
修复了许多与套接字相关的问题,这些问题导致与 gen_tcp 和 gen_udp 分别不兼容。
自有 ID:OTP-18685
带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。
自有 ID:OTP-18707 辅助 ID:#7530
`inet_res` 使用的 DNS RR 缓存已修复为保留插入顺序,这在 DNS 服务器出于例如负载平衡目的以某种特定顺序返回 RR 时很有益处。
自有 ID:OTP-18731 辅助 ID:GH-7577,PR-7578
`reuseport`、`reuseport_lb` 和 `exclusiveaddruse` 选项在例如 `gen_udp:open/1,2` 中被意外禁止,现在已得到纠正。
自有 ID:OTP-18734 辅助 ID:OTP-18344,PR-6522,GH-6461,GH-7569
已修复用于二进制模式和被动模式下 Unix 域套接字的
gen_udp:recv/*
不会崩溃的问题。自有 ID:OTP-18747 辅助 ID:GH-7605
修复了在导航 shell 历史记录时,光标不会放在表达式末尾的问题。
自有 ID:OTP-18757 辅助 ID:PR-7631
改进和新功能
更新 gen_tcp_socket 和 gen_udp_socket 以处理“完成”(Windows 上的套接字)。
自有 ID:OTP-18586 辅助 ID:OTP-18029
为 Windows 上用于“套接字”的 Unix 域套接字(仅用于 STREAM 套接字)添加了基本支持。
自有 ID:OTP-18611 辅助 ID:OTP-18029,#5024
为 Windows 上的套接字 ioctl 添加了基本支持。
自有 ID:OTP-18660
file:location/0
类型现在已导出。自有 ID:OTP-18681
添加了对(Windows)套接字选项 exclusiveaddruse 的支持。
自有 ID:OTP-18686
[套接字] 添加了对“nopush”选项的支持。
自有 ID:OTP-18687
添加了对套接字选项“BSP STATE”的支持。
自有 ID:OTP-18693
添加了 tcp 套接字选项“keepcnt”、“keepidle”和“keepintvl”。
自有 ID:OTP-18698
添加了对 misc (Windows) 套接字选项(“max_msg_size”和“maxdg”)的支持。
自有 ID:OTP-18710
shell 的键盘快捷键现在可配置。
自有 ID:OTP-18754 辅助 ID:PR-7604 PR-7647
优化了 code_server,以减少并发加载同一模块时的重复工作。
自有 ID:OTP-18755 辅助 ID:PR-7503
Kernel 9.0.2
修复的 Bug 和故障
修复了在终端中输入 Alt+Enter 时,光标会移动到最后一行而不是移动到下一行的 Bug。
自有 ID:OTP-18580 辅助 ID:PR-7242
修复了当 termcap 不可用时,shell 不会在启动时崩溃的问题。
自有 ID:OTP-18624 辅助 ID:GH-7296
多个 socket:accept 调用问题。进行多个 accept 调用时,只有最后一个调用处于活动状态。
自有 ID:OTP-18635 辅助 ID:#7328
修复了 shell,使其在终端功能报告应该使用时忽略终端延迟。
自有 ID:OTP-18636 辅助 ID:PR-7352 GH-7308
修复了 "oldshell" 以在 Windows 上键入时回显字符。
自有 ID:OTP-18637 辅助 ID:PR-7359 GH-7324
修复了在使用
-noshell
启动 erlang 时从 stdin 读取时的 eof 处理。自有 ID:OTP-18640 辅助 ID:PR-7384 GH-7368 GH-7286 GH-6881
在 Windows 上,当有等待读取、写入或接受函数的活动调用时,调用函数 socket:close 可能会挂起。
自有 ID:OTP-18646
修复了在 Windows 上使用
-noshell
标志启动 erl.exe 时读取或配置standard_io
时出现的问题。自有 ID:OTP-18649 辅助 ID:GH-7261 PR-7400
当地址是主机名(字符串或原子)时,带有 inet_backend = socket 的 gen_udp:connect 失败。
自有 ID:OTP-18650
修复了如果将特定转义序列写入 stdout,会导致 shell 崩溃的问题。
自有 ID:OTP-18651 辅助 ID:PR-7242
修复了如果在 shell 中写入提示后收到输出,则输出会消失的问题。
自有 ID:OTP-18652 辅助 ID:PR-7242
修复了无法在 rebar3 开发版本中找到 erts 位置的崩溃问题。
自有 ID:OTP-18656 辅助 ID:PR-7404 GH-7390
引入了 KERNEL 应用程序参数
standard_io_encoding
,该参数可用于设置 standard_io 的默认编码。如果应用程序希望将所有输入数据视为字节而不是 utf-8 编码的字符,则此选项需要设置为latin1
。自有 ID:OTP-18657 辅助 ID:GH-7230 PR-7384
Kernel 9.0.1
修复的 Bug 和故障
POSIX 错误
exdev
有时在某些错误消息中被错误地描述为“跨域链接”。自有 ID:OTP-18578 辅助 ID:GH-7213
更正了套接字发送函数描述(使用 Timeout = nowait 发送)。发送函数无法返回 {ok, {RestData, SelectInfo}}
自有 ID:OTP-18584 辅助 ID:#7238
内核 9.0
修复的错误和故障
修复了应用程序的 .app 文件中允许重复键的错误。现在会拒绝重复键,如果存在重复键,应用程序将无法启动。
*潜在的不兼容性*
自有 ID:OTP-18210 辅助 ID:GH-5877 PR-5878
修复了在条件分支中 logger_formatter 对分支值处理不一致的问题。例如,在此修复之前,在条件分支中使用
msg
将不会按预期格式化。自有 ID:OTP-18225 辅助 ID:PR-6036
修复了 logger_std_h 处理程序,使其在因任何原因无法记录到 standard_io 时,将日志记录到 standard_error。
自有 ID:OTP-18226 辅助 ID:PR-6253
修复了在嵌入模式下启动 Erlang 且在内核完全启动之前完成连接时,TLS 分发无法工作的问题。
自有 ID:OTP-18248 辅助 ID:PR-6227 GH-6085
改进了 erl
-remsh
,以提供更好的错误原因,并在使用没有终端支持的 shell(即“oldshell”)时工作。自有 ID:OTP-18271 辅助 ID:PR-6279
修复了在内核启动之前生成的日志事件,使其在格式化这些日志消息的代码尚未加载时不会失败。
自有 ID:OTP-18286 辅助 ID:PR-5955
当启动的进程失败时,
proc_lib:start*/*
已变为同步。这要求失败的进程使用新函数proc_lib:init_fail/2,3
或退出以指示失败。所有 OTP 行为都已修复以执行此操作。现在,所有这些启动函数都会为所有错误返回消耗来自进程链接的
'EXIT'
消息。以前,只有start_link/*
函数执行此操作,并且仅在启动的函数退出时,而不是在使用init_ack/1,2
或init_fail/2,3
创建返回值时。*潜在的不兼容性*
自有 ID:OTP-18471 辅助 ID:GH-6339, PR-6843
修复了
file:read(standard_io, ...)
在二进制模式下意外返回eof
的错误。自有 ID:OTP-18486 辅助 ID:PR-6881
修复了
seq_trace:get_token/1
的返回类型。自有 ID:OTP-18528 辅助 ID:PR-7009
现在,查找、连接和发送到名称为空的主机,是通过尝试查找根域的地址来处理的,这将会失败。以前,其中一些操作会导致内部异常,这与类型规范相矛盾。
自有 ID:OTP-18543 辅助 ID:GH-6353
用 ANSI 选择图形再现转义字符的特殊情况处理替换了正则表达式,以加快使用这些转义序列的 io 输出。
自有 ID:OTP-18547 辅助 ID:PR-7092
改进和新功能
Erlang shell 已得到改进,以支持以下功能
- 自动完成变量、记录名称、记录字段名称、映射键、函数参数类型和文件名。
- 在 shell 中打开外部编辑器(使用 C-o)以在编辑器中编辑当前表达式。
- 支持在 shell 中定义记录(带类型)、函数和函数类型规范以及自定义类型。
- 不要在历史记录中保存寻呼机命令和 io:getline 的输入。
自有 ID:OTP-14835 辅助 ID:PR-5924
TTY/终端子系统已重写,将更多代码从旧的链接驱动程序移动到 Erlang,并在 NIF 中实现了所有需要的 I/O 原语。
在 Unix 平台上,除了更好地处理 Unicode 字符和修复一些长期存在的错误外,用户应该不会注意到太多差异。
Windows 用户会注意到 erl.exe 具有与普通 Unix shell 相同的功能,并且 werl.exe 已被删除并替换为指向 erl.exe 的符号链接。这使得 Windows Erlang 终端体验与 Unix 的体验相同。
重写带来了许多错误修复和功能添加
- 现在,当 Erlang 退出时,TTY 会被重置,从而修复了 zsh 在终止 Erlang 会话时不会崩溃的问题。
standard_error
现在使用与standard_io
相同的 Unicode 模式。- 在使用空搜索字符串搜索 shell 历史记录时,按退格键不再会使 shell 崩溃。
- 现在,在使用 JCL 接口启动的远程节点上可以使用制表符扩展。
- 现在可以配置 shell 标语和会话标语(即在启动 Erlang shell 时显示的文本)。有关更多详细信息,请参阅内核文档。
- 添加了 shell:start_interactive,用于从非交互式 Erlang 会话(例如 escript)启动交互式 shell。
- 在 Windows 上,当以分离模式启动时,标准处理程序现在设置为
nul
设备,而不是取消设置。 - 如果支持,标准 I/O 现在始终默认为
unicode
模式。以前,如果运行时系统已使用-oldshell
或-noshell
启动(例如在escript
中),则默认值为latin1
。要通过标准输出发送原始字节,现在必须显式指定io:setopts(standard_io, [{encoding, latin1}]).
*潜在的不兼容性*
自有 ID:OTP-17932 辅助 ID:PR-6144 GH-3150 GH-3390 GH-4343 GH-4225
添加了对 Windows 上套接字的支持。
- 预发布状态。
- 错误代码尚未最终确定。
- 没有对 Windows 特定选项的显式支持(套接字选项、读取和写入的标志)。
- Windows 的新异步 API(完成)。请参阅(套接字用法)用户指南中的“异步调用”章节。
- 为确保平台独立性,*计划*使用 gen_tcp 和 gen_udp(尚未更新)。
自有 ID:OTP-18029
自 OTP 24 版本发布以来宣布,现在强制使用
- 外部项格式中的版本 4 节点容器类型。也就是说,引用支持多达 5 个 32 位整数标识符,以及支持 64 位数据存储的进程和端口标识符。因此,分发标志
DFLAG_V4_NC
现在也是强制性的。自 OTP 24 以来,OTP 支持此功能。另请注意,term_to_binary()
和term_to_iovec()
生成的外部格式将无条件地生成支持此更大格式的 pid、端口和引用。 - 在 OTP 23.3 中引入的新链接协议 现在是强制性的。因此,分发标志
DFLAG_UNLINK_ID
现在也是强制性的。
由于上述原因,OTP 26 节点将拒绝连接到 OTP 24 之前版本的 OTP 节点。
*潜在的不兼容性*
自有 ID:OTP-18140 辅助 ID:PR-6072
- 外部项格式中的版本 4 节点容器类型。也就是说,引用支持多达 5 个 32 位整数标识符,以及支持 64 位数据存储的进程和端口标识符。因此,分发标志
已将对内核 TLS (kTLS) 的支持添加到 SSL 应用程序中,用于 TLS 分发(
-proto_dist inet_tls
)和 SSL 选项{ktls, true}
。将此用于常规 SSL 套接字是不方便、未记录且不推荐的,因为它需要非常依赖于平台的原始选项。目前,这仅适用于一些不太旧的 Linux 发行版。大致来说,需要支持用户空间协议和内核模块
tls
的 5.2.0 或更高版本的内核。自有 ID:OTP-18235 辅助 ID:PR-6104, PR-5840
添加了 code:get_doc/2,它支持使用 debug_info 块而不是 eep48 doc 块来获取函数的文档框架。
自有 ID:OTP-18261 辅助 ID:PR-5924
Erlang shell 在键入
tab
时的自动完成已更改为在编辑当前行之后而不是之前发生。此行为可以使用
shell_expand_location
STDLIB 配置参数进行配置。自有 ID:OTP-18278 辅助 ID:PR-6260
现在,在 shell 中键入
Ctrl+L
会清除屏幕并重绘当前行,而不仅仅是重绘当前行。要仅重绘当前行,现在必须键入Alt+L
。这使Ctrl+L
的行为更接近 bash 和其他 shell 的工作方式。*潜在的不兼容性*
自有 ID:OTP-18285 辅助 ID:PR-6262
通过缓存回调函数优化了 gen_server
自有 ID:OTP-18305 辅助 ID:PR-5831
为升级准备
pg
通信协议。计划是使 OTP-28 节点能够使用升级的pg
协议,同时仍然能够与 OTP 26 节点通信。自有 ID:OTP-18327 辅助 ID:PR-6433
新的
disk_log
日志类型rotate
,其中日志文件在轮换时压缩。自有 ID:OTP-18331 辅助 ID:ERIERL-870
引入了以下
inet:setopts/2
选项reuseport
- 重用本地端口。可能会或可能不会根据底层操作系统提供负载平衡。reuseport_lb
- 重用本地端口。提供负载平衡。exclusiveaddruse
- Windows 上的独占地址/端口使用。此套接字选项特定于 Windows,在其他系统上将被静默忽略。
在 Windows 上设置
reuseaddr
的行为已以*向后不兼容*的方式更改。现在,只有在设置了reusaddr
和reuseport
inet
选项的情况下,才会设置底层SO_REUSEADDR
套接字选项。这是因为 Windows 上的底层SO_REUSEADDR
套接字选项的行为类似于在设置了底层套接字选项SO_REUSEADDR
和SO_REUSEPORT
时 BSD 的行为。有关更多信息,请参阅reuseaddr
选项的文档。*潜在的不兼容性*
自有 ID:OTP-18344 辅助 ID:PR-6522, PR-6944, OTP-18324, PR-6481, GH-6461
将 size/1 替换为 tuple_size/1 或 byte_size/1
JIT 不会优化
size/1
BIF,并且其使用会导致 Dialyzer 的类型更差。当已知正在测试的值必须是元组时,应始终首选
tuple_size/1
。当已知正在测试的值必须是二进制时,应首选
byte_size/1
。但是,byte_size/1
也接受位串(将大小向上舍入为整数个字节),因此必须确保在调用byte_size/
之前调用is_binary/1
,以确保拒绝位串。请注意,编译器会删除对is_binary/1
的冗余调用,因此如果不确定以前的代码是否已确保参数是二进制,则在调用byte_size/1
之前添加is_binary/1
测试不会造成损害。自有 ID: OTP-18405 辅助 ID: GH-6672,PR-6702,PR-6768,PR-6700,PR-6769,PR-6812,PR-6814
函数
file:pid2name/1
已弃用,将在 Erlang/OTP 27 中移除。自有 ID: OTP-18419
Erlang DNS 解析器模块
inet_res
和辅助模块已更新以支持 RFC6891;可以处理带有 DNSSEC OK (DO) 位的 OPT RR。自有 ID: OTP-18442 辅助 ID: PR-6786, GH-6606
引入了
application:get_supervisor/1
。自有 ID: OTP-18444 辅助 ID: PR-6035
通过在嵌入模式的启动顺序中添加一个额外的步骤来改进
on_load
模块在启动时的处理,该步骤运行所有on_load
处理程序,而不是依赖于稍后在内核监管树启动时显式调用它们。这主要是一个代码改进和 OTP 内部简化,以避免未来的错误并简化代码维护。
自有 ID: OTP-18447
通过在客户端进行代码准备来减少 code_server 上的争用。
自有 ID: OTP-18448 辅助 ID: PR-6736
添加了一种模式来确保所有加载,以并发启动子应用程序及其依赖项。
自有 ID: OTP-18451 辅助 ID: PR-6737
缓存 OTP 启动代码路径,以限制模块查找期间访问的文件夹数量。可以使用 -cache_boot_path false 禁用。OTP 启动代码路径由 ERL_LIB 环境变量组成。各种 otp/*/ebin 文件夹。以及 init 脚本中的 {path, ...} 子句。
自有 ID: OTP-18452 辅助 ID: PR-6729
内核和 SSL 中的 Erlang 分布代码进行了一些重构,以方便调试和重用,这不应该对行为或性能产生任何明显的影响。
自有 ID: OTP-18456
向代码路径 API 添加缓存属性。
向所有 code:add_path、code:set_path 和 code:replace_path* 函数添加了一个可选的 cache/nocache 参数。如果它们被缓存,这些函数将避免进行文件访问。可以使用 code:clear_cache/0 清除缓存。添加了 code:del_paths/1,以便更容易清除多个路径。
自有 ID: OTP-18466 辅助 ID: PR-6832
弃用
dbg:stop_clear/0
,因为它只是dbg:stop/0
的函数别名。自有 ID: OTP-18478 辅助 ID: GH-6903
改进了 code:ensure_modules_loaded/1:之前它会准备模块,如果这些模块有 on_load 回调,则会放弃对这些模块的引用。此拉取请求使其保留这些引用,然后串行加载它们,而无需再次获取对象代码并准备它们。
自有 ID: OTP-18484 辅助 ID: PR-6844
内部 DNS 解析器已更新以处理 DNS LOC RR:s (RFC 1876)。这是一个未记录的模块,但仍被高级用户使用。请参阅源代码。
自有 ID: OTP-18510 辅助 ID: GH-6098, PR-6982
减少了在
global
中通知其他节点关于连接丢失时的内存消耗。自有 ID: OTP-18521 辅助 ID: PR-7025
net_kernel
、global
和global_group
服务器现在始终启用完全异步的分布式信号,这可以防止它们在发送分布式信号时被阻塞。关于阻塞分布式信号的文档也得到了改进。
自有 ID: OTP-18533 辅助 ID: PR-7061
允许将 IPv6 地址作为主机,在
erlang:decode_packet/3
和gen_tcp
数据包选项解码的http
数据包中。根据 RFC2732,IPv6 地址应括在[]
中。自有 ID: OTP-18540 辅助 ID: PR-6900
移除 OTP-26 中已弃用的函数
自有 ID: OTP-18542
移除了
code:is_module_native/1
,因为 HiPE 已被移除。自 OTP 24 起,它已被弃用,并计划在 OTP 26 中移除。移除了
code:rehash/0
,因为代码路径功能不再存在。自 OTP 19 起,它已被弃用,自 OTP 24 起,计划在 OTP 26 中移除。*潜在的不兼容性*
自有 ID: OTP-18551 辅助 ID: PR-7106
在 shell 中添加了对多行表达式和导航的支持。添加了新的快捷键
- 向上导航 (ctrl+up)/(alt+up)
- 向下导航 (ctrl+down)/(alt+down)
- 在行中间插入换行符 (alt+enter)
- 导航到顶部 (alt+<)/(alt+shift+up)
- 导航到底部 (alt+>)/(alt+shift+down)
- 清除当前表达式 (alt+c)
- 取消搜索 (alt+c)
- 在 mac 上打开编辑器 (option+o)/(alt+o)
修改新行的提示符,使其更清楚地表明提示符已进入多行模式。支持窗口大小较小的终端,建议不低于 7 行和 40 列。修改搜索提示符以支持多行语句。从 JCL 菜单继续后重绘提示符。
自有 ID: OTP-18575 辅助 ID: PR-7169
Kernel 8.5.4.3
修复的错误和故障
修复了 gen_udp:open/2 类型规范,以包含已支持的模块套接字地址类型。
自有 ID: OTP-19050 辅助 ID: OTP-18990
Kernel 8.5.4.2
修复的错误和故障
带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。
自有 ID:OTP-18707 辅助 ID:#7530
Kernel 8.5.4.1
修复的错误和故障
多个 socket:accept 调用问题。进行多个 accept 调用时,只有最后一个调用处于活动状态。
自有 ID:OTP-18635 辅助 ID:#7328
当地址是主机名(字符串或原子)时,带有 inet_backend = socket 的 gen_udp:connect 失败。
自有 ID:OTP-18650
Kernel 8.5.4
修复的错误和故障
修复了 Windows 上的一个错误,其中
file:read_file_info/1
对于具有损坏元数据的文件会失败。自有 ID: OTP-18348 辅助 ID: GH-6356
接受来自未使用 epmd 的 OTP 23 和 24 节点的连接设置。
自有 ID: OTP-18404 辅助 ID: GH-6595, PR-6625
Kernel 8.5.3
修复的错误和故障
tcp 连接选项 'bind_to_device' 不能与 inet_backend = 'socket' 一起使用。'inet' 需要值类型 binarry(),'socket' 需要值类型 'string()'。
自有 ID: OTP-18357 辅助 ID: #6509
在调用 gen_tcp:connect 时,当使用 sockaddr() 和 inet_backend = socket 时,处理选项的小问题。
自有 ID: OTP-18358 辅助 ID: #6528
Kernel 8.5.2
修复的错误和故障
修复了当另一端关闭套接字时,gen_tcp 套接字后端中的关闭崩溃。
自有 ID: OTP-18270 辅助 ID: #6331
erl_tar
现在可以读取经过填充的 gzip 压缩的 tar 文件。file:open/2
有一个新的选项compressed_one
,它将从 gzip 文件中读取单个成员。自有 ID: OTP-18289 辅助 ID: PR-6343
修复了
os:cmd
不将抛出的所有异常转换为badarg
的问题。例如,来自erlang:open_port
的emfile
被转换为badarg
。此错误自 Erlang/OTP 24 以来一直存在。
自有 ID: OTP-18291 辅助 ID: PR-6382
函数 net:if_names/0 的规范不正确
自有 ID: OTP-18296 辅助 ID: OTP-16464
当使用带有 'socket' inet_backend 的 gen_udp 时,缺少 TOS 和 TTL 的 ctrl 选项名称转换(在 FreeBSD 上)。
自有 ID: OTP-18315
带有选项 add_membership 或 drop_membership 的 gen_udp:open/2 会删除较早的选项。
自有 ID: OTP-18323 辅助 ID: #6476
除非套接字是 UDP 套接字,否则在 Windows 上将忽略
inet:setopts/2
{reuseaddr, true}
选项。有关更多信息,请参阅inet:setopts/2
文档中关于reuseaddr
选项的文档。在 OTP 25 之前,在 Windows 上所有套接字都忽略了
{reuseaddr, true}
选项,但从 OTP 25.0 开始,此选项已更改为不忽略任何套接字。*潜在的不兼容性*
自有 ID: OTP-18324 辅助 ID: GH-6461, PR-6481
改进和新功能
清理了
inet_tcp_dist
中的分布式套接字选项处理,以明确哪些是必需的,哪些只是具有默认值。自有 ID: OTP-18293
改进 gen_tcp_socket 的警告消息格式。
自有 ID: OTP-18317
Kernel 8.5.1
修复的错误和故障
使用套接字模块创建的侦听套接字泄漏了 (erlang-) 监视器。
自有 ID: OTP-18240 辅助 ID: #6285
当监管控制连接的进程崩溃时,
peer
节点未能停止。当使用备用控制连接时,当peer
节点被启动它的节点停止时,此监管进程也经常崩溃,这会导致peer
节点在没有停止的情况下徘徊。自有 ID: OTP-18249 辅助 ID: PR-6301
Kernel 8.5
修复的错误和故障
修复了由于
nodeup
/nodedown
消息在连接上的流量之前/之后未传递而导致的global
中的不一致性错误。还修复了global_group
和global
中的各种其他不一致性错误和死锁。作为这些修复的基础,引入了一个新的 BIF
erlang:nodes/2
,并扩展了net_kernel:monitor_nodes/2
。如果命令行上存在多个实例,
-hidden
和-connect_all
命令行参数将无法工作,此问题已得到修复。为了替换-connect_all
命令行参数,还引入了新的内核参数connect_all
。自有 ID:OTP-17934 辅助 ID:PR-6007
修复了 IPv6 multicast_if 和成员套接字选项。
自有 ID:OTP-18091 辅助 ID:#5789
修复了在纯 IPv6 Windows 上 inet:getifaddrs 挂起的问题
自有 ID:OTP-18102 辅助 ID:#5904
关于 SCTP 选项,
inet:getopts/2
和inet:setopts/2
的类型规范已更正。自有 ID:OTP-18115 辅助 ID:PR-5939
inet:parse_*
的类型规范已收紧。自有 ID:OTP-18121 辅助 ID:PR-5972
修复了 gen_tcp:connect/3 规范以包含 inet_backend 选项。
自有 ID:OTP-18171 辅助 ID:PR-6131
修复了当调用
logger:log(Level, Format, Args)
(或任何其他日志记录函数)时,使用二进制格式会导致崩溃或日志记录不正确的问题。自有 ID:OTP-18229 辅助 ID:PR-6212
改进和新功能
为基于 inet-driver 的套接字(如 gen_tcp 和 gen_udp)添加了基本的调试功能(选项)。
自有 ID:OTP-18032
在
net_kernel:start/2
中引入了hidden
和dist_listen
选项。还记录了
-dist_listen
命令行参数,该参数错误地记录为kernel
参数,而不是命令行参数。自有 ID:OTP-18107 辅助 ID:PR-6009
在
pg
中引入了作用域和组监视。有关更多信息,请参阅pg:monitor_scope()
、pg:monitor()
和pg:demonitor()
的文档。自有 ID:OTP-18163 辅助 ID:PR-6058,PR-6275
引入了一个新函数
global:disconnect/0
,可以使用它来干净地断开节点与global
节点集群中所有其他节点的连接。自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264
Kernel 8.4.2
已修复的错误和故障
在建立连接的同时调用
net_kernel:setopts(new, Opts)
可能会导致net_kernel
进程和建立连接的进程之间发生死锁。自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216
Kernel 8.4.1
已修复的错误和故障
DNS 解析器
inet_res
已被修复,在验证响应时,它会忽略发送的请求和接收的响应之间请求域中的尾随点差异。自有 ID:OTP-18112 辅助 ID:ERIERL-811
修复了
inet_res
中的一个错误,其中缺少内部的{ok,_}
包装器导致inet_res:resolve/*
在解析 IP 地址或作为 IP 地址字符串的主机名时,返回计算的主机名而不是{ok,Msg}
元组。自有 ID:OTP-18122 辅助 ID:GH-6015,PR-6020
在配置的分布式服务可用之前,
erlang:is_alive()
BIF 可能会返回true
。此错误是在 OTP 25.0 ERTS 版本 13.0 中引入的。即使配置的分布式服务可用,
erlang:monitor_node()
和erlang:monitor()
BIF 也可能错误地失败。如果这些 BIF 在使用动态节点名称分配启动分布式服务之后但在分配名称之前被调用,则会发生这种情况。自有 ID:OTP-18124 辅助 ID:OTP-17558,PR-6032
在
gen_tcp_dist
示例中添加了缺少的强制性address/0
回调。自有 ID:OTP-18136
Kernel 8.4
已修复的错误和故障
DNS 解析器实现已重写,以更彻底地验证回复,并进行了一些优化以减少垃圾的产生。
自有 ID:OTP-17323
套接字选项“reuseaddr”在 Windows 上不再被忽略。
自有 ID:OTP-17447 辅助 ID:GH-4819
修复了当调用
logger:log(Level, Format, Args)
(或任何其他日志记录函数)时,使用原子string
或report
作为格式会导致崩溃或日志记录不正确的问题。自有 ID:OTP-17551 辅助 ID:GH-5071 PR-5075
从 OTP 25 开始,
global
默认情况下将通过主动断开与报告已丢失与其他节点连接的节点的连接来防止由于网络问题而导致的重叠分区。这将导致形成完全连接的分区,而不是将网络置于具有重叠分区的状态。可以使用
prevent_overlapping_partitions
kernel(6)
参数禁用防止重叠分区,使global
的行为像以前一样。然而,对于所有期望提供完全连接的网络的应用程序(例如mnesia
),以及对于global
本身,这都是有问题的。重叠分区的网络可能会导致global
的内部状态变得不一致。即使在将这些分区合并在一起以再次形成完全连接的网络之后,这种不一致性仍然可能存在。对期望保持完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生故障。由于您可能会遇到难以检测的问题而没有此修复程序,因此强烈建议您不要禁用此修复程序。另请注意,此修复程序必须在网络中的所有节点上启用才能正常工作。*潜在的不兼容性*
自有 ID:OTP-17911 辅助 ID:PR-5687,PR-5611,OTP-17843
启动用于名称解析的辅助程序;
inet_gethost
,已得到改进,可以使用绝对文件系统路径来确保启动正确的程序。如果无法启动辅助程序,则系统现在会停止运行,以避免在名称解析器静默损坏的情况下运行。
自有 ID:OTP-17958 辅助 ID:OTP-17978
inet_res:getbyname/2,3
的类型规范已更正,以反映它可以返回特殊的#hostent{}
记录。自有 ID:OTP-17986 辅助 ID:PR-5412,PR-5803
code:module_status/1
总是会将从存档加载的 BEAM 文件报告为modified
,并且code:modified_modules/0
总是会返回从存档加载的所有模块的名称。自有 ID:OTP-17990 辅助 ID:GH-5801
在日志记录器中,通过使用 erlang 定时器而不是定时器模块的定时器来修复文件处理程序关闭延迟。
自有 ID:OTP-18001 辅助 ID:GH-5780 PR-5829
修复了在失败时日志记录器生成的日志事件中的元数据不包含原始日志事件的元数据的问题。
自有 ID:OTP-18003 辅助 ID:PR-5771
修复日志记录器文件后端以重新创建已删除的日志文件夹。
自有 ID:OTP-18015 辅助 ID:GH-5828 PR-5845
[套接字] sockaddr 的编码已得到改进。
自有 ID:OTP-18020
修复了使用不完整的 unicode 数据向 io 服务器发出的
put_chars
请求,使其以no_translation
错误退出。自有 ID:OTP-18070 辅助 ID:PR-5885
改进和新功能
net 模块现在可以在 Windows 上运行。
自有 ID:OTP-16464
Erlang 安装目录现在可以在文件系统上重定位,前提是安装的
RELEASES
文件中的路径是相对于安装根目录的路径。如果将其RootDir
参数设置为空字符串,则`release_handler:create_RELEASES/4
函数可以生成一个具有相对路径的RELEASES
文件。自有 ID:OTP-17304
以下分发标志现在是强制性的:
DFLAG_BIT_BINARIES
、DFLAG_EXPORT_PTR_TAG
、DFLAG_MAP_TAGS
、DFLAG_NEW_FLOATS
和DFLAG_FUN_TAGS
。这主要涉及自己实现分发协议的库或应用程序。自有 ID:OTP-17318 辅助 ID:PR-4972
修复
os:cmd
使其在 Android 操作系统上工作。自有 ID:OTP-17479 辅助 ID:PR-4917
配置文件
.erlang
、.erlang.cookie
和.erlang.crypt
现在可以位于 XDG 配置主目录中。有关更多详细信息,请参阅每个文件的文档和
filename:basedir/2
。自有 ID:OTP-17554 辅助 ID:GH-5016 PR-5408 OTP-17821
动态节点名称改进:
erlang:is_alive/0
更改为对挂起的动态节点名称返回 true,以及新函数net_kernel:get_state/0
。自有 ID:OTP-17558 辅助 ID:OTP-17538,PR-5111,GH-5402
在
gen_statem
中,回调结果类型的类型已通过元数为 2 的类型进行了扩充,其中回调模块可以指定回调数据的类型,以便回调模块可以获得它的类型验证。自有 ID:OTP-17589 辅助 ID:PR-4926
标记的元组测试和函数调用已得到优化,现在比以前稍微便宜一些。
通过确保所有装箱的项在元数字字之后至少分配一个字,这些优化成为可能。这是通过让所有空元组引用相同的空元组文字来实现的,这也减少了空元组的内存使用。
自有 ID:OTP-17608
引入了
net_ticker_spawn_options
kernel
配置参数,可以使用它为分发通道定时器进程设置生成选项。自有 ID:OTP-17617 辅助 ID:PR-5069
大多数(或至少是最常用的)
rpc
操作现在需要erpc
支持才能与其他 Erlang 节点通信。erpc
是在 OTP 23 中引入的。也就是说,针对 OTP 23 之前版本的 Erlang 节点的rpc
操作将会失败。*潜在的不兼容性*
自有 ID:OTP-17681 辅助 ID:PR-5307
新模块
peer
取代了slave
模块。slave
模块现在已弃用,将在 OTP 27 中删除。peer
包含一个扩展且更强大的 API 用于启动 erlang 节点。自有 ID:OTP-17720 辅助 ID:PR-5162
为了方便用户管理多个未完成的异步
call
请求,erpc
、gen_server
、gen_statem
和gen_event
中引入了使用请求标识符集合的新功能。自有 ID:OTP-17784 辅助 ID:PR-5792
类型规范已添加到
gen_server
中,并且文档已更新以使用此规范。这暴露了一些类型违规,这些违规已在
global
、logger_olp
和rpc
中得到纠正。自有 ID:OTP-17915 辅助 ID:PR-5751、GH-2375、GH-2690
IP 地址验证函数
is_ipv4_address/1
、is_ipv6_address/1
和is_ip_address/1
已添加到 Kernel 中的模块inet
中。自有 ID:OTP-17923 辅助 ID:PR-5646
以
gen_sctp:connectx_init/*
的形式添加了多宿主 SCTP 连接的 API。自有 ID:OTP-17951 辅助 ID:PR-5656
[socket] 添加了类型 sockaddr_ll(系列 'packet')的字段 hatype 的编码。
自有 ID:OTP-17968 辅助 ID:OTP-16464
添加了对 EEP-60 中描述的可配置功能的支持。可以在编译期间使用选项(
-enable-feature Feature
、-disable-feature Feature
和+{feature, Feature, enable|disable}
)到erlc
以及使用文件中的指令(-feature(Feature, enable|disable).
)启用/禁用功能。类似的选项可以用于erl
,以启用/禁用运行时允许的功能。新的maybe
表达式(EEP-49)完全支持作为功能maybe_expr
。该功能支持已在参考手册中进行了文档说明。自有 ID:OTP-17988
Kernel 8.3.2.4
已修复的 Bug 和故障
带有套接字地址和套接字 (inet-) 后端的 gen_tcp:connect 因缺少回调函数而失败。
自有 ID:OTP-18707 辅助 ID:#7530
Kernel 8.3.2.3
已修复的 Bug 和故障
函数 net:if_names/0 的规范不正确
自有 ID: OTP-18296 辅助 ID: OTP-16464
当使用带有 'socket' inet_backend 的 gen_udp 时,缺少 TOS 和 TTL 的 ctrl 选项名称转换(在 FreeBSD 上)。
自有 ID: OTP-18315
tcp 连接选项 'bind_to_device' 不能与 inet_backend = 'socket' 一起使用。'inet' 需要值类型 binarry(),'socket' 需要值类型 'string()'。
自有 ID: OTP-18357 辅助 ID: #6509
在调用 gen_tcp:connect 时,当使用 sockaddr() 和 inet_backend = socket 时,处理选项的小问题。
自有 ID: OTP-18358 辅助 ID: #6528
改进和新功能
改进 gen_tcp_socket 的警告消息格式。
自有 ID: OTP-18317
Kernel 8.3.2.2
改进和新功能
引入了一个新函数
global:disconnect/0
,可以使用它来干净地断开节点与global
节点集群中所有其他节点的连接。自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264
Kernel 8.3.2.1
已修复的 Bug 和故障
在建立连接的同时调用
net_kernel:setopts(new, Opts)
可能会导致net_kernel
进程和建立连接的进程之间发生死锁。自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216
Kernel 8.3.2
已修复的 Bug 和故障
使用 inet-backend 'socket' 创建的套接字的 'raw' 选项的 inet:getopts/2 失败。
自有 ID:OTP-18078 辅助 ID:GH-5930
在使用 inet_backend = socket 时,更正了关闭函数的行为。它与“旧” gen_tcp 的兼容性不够。
自有 ID:OTP-18080 辅助 ID:GH-5930
Kernel 8.3.1
已修复的 Bug 和故障
修复了从同一节点静默关闭先前建立的连接后,接受连接设置失败的问题。
自有 ID:OTP-17979 辅助 ID:ERIERL-780
修复了如果历史记录日志文件存在问题,在 shell 中键入 Ctrl-R 可能导致挂起的问题。
自有 ID:OTP-17981 辅助 ID:PR-5791
Kernel 8.3
已修复的 Bug 和故障
已更正
gen_tcp
的send_timeout
的处理,以便在发送 0 个字节时也遵守超时。自有 ID:OTP-17840
默认情况下,当由于网络问题导致连接丢失时,
global
不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如mnesia
),以及global
本身,这都是有问题的。重叠分区的网络可能导致global
的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。为了防止此类问题,我们引入了一个防止重叠分区的修复程序,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用该修复程序。启用此修复程序后,global
将主动断开与报告已断开与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。请注意,为了正常工作,必须在网络中的所有节点上启用此修复程序。由于这会相当大地改变行为,因此目前默认情况下禁用此修复程序。但是,由于您可能会在没有此修复程序的情况下遇到难以检测到的问题,因此强烈建议您启用此修复程序以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611
修复了当记录包含不正确列表的报告时
logger
会崩溃的 bug。自有 ID:OTP-17851
使
erlang:set_cookie
适用于动态节点名称。自有 ID:OTP-17902 辅助 ID:GH-5402、PR-5670
改进和新功能
添加了在使用 gen_sctp、gen_tcp 和 gen_udp 时使用 socket:sockaddr_in() 和 socket:sockaddr_in6() 的支持。这将使得可以使用链路本地 IPv6 地址。
自有 ID:OTP-17455 辅助 ID:GH-4852
引入了
net_tickintensity
kernel
参数。它可以用于控制在net_ticktime
期间的刻度数。还引入了新的
net_kernel:start/2
函数,以便更容易添加新选项。已弃用net_kernel:start/1
的使用。自有 ID:OTP-17905 辅助 ID:ERIERL-732、PR-5740
改进了动态节点名称功能的文档。
自有 ID:OTP-17918
Kernel 8.2
已修复的 Bug 和故障
socket:which_sockets( pid() ) 在查找套接字所有者时使用错误的关键字('ctrl' 而不是 'owner')。
自有 ID:OTP-17716
在 epmd_ntop 中,#if defined(EPMD6) 条件被反转,并且仅当 EPMD6 未定义时才包含特定于 IPv6 的代码。这导致 IPv6 地址被解释为 IPv4 地址,并生成无意义的 IPv4 地址作为输出。
有几个地方错误地使用 'num_sockets' 而不是 'i' 来索引到 iserv_addr 数组中进行错误记录。这将导致读取 iserv_addr 数组中未初始化的数据。
感谢 John Eckersberg 提供此修复程序。
自有 ID:OTP-17730
对
erl_uds_dist
分布模块示例进行微小的修复。自有 ID:OTP-17765 辅助 ID:PR-5289
已修复传统 TCP 套接字适配模块
gen_tcp_socket
的一个 bug,它在给定文件描述符时绑定到套接字地址,但不应如此。自有 ID:OTP-17793 辅助 ID:PR-5348、OTP-17451、PR-4787、GH-4680、PR-2989、OTP-17216
改进了由于参数无效导致
open_port/2
失败时的错误打印输出。自有 ID:OTP-17805 辅助 ID:PR-5406
在已关闭的套接字上调用 socket:monitor/1 应该成功并导致立即的 DOWN 消息。现在已修复此问题。
自有 ID:OTP-17806
修复了配置选项
logger_metadata
以使其正常工作。自有 ID:OTP-17807 辅助 ID:PR-5418
修复了 tls 和非 tls 分布,以使用 erl_epmd:address_please 来确定在连接到远程节点时应使用 IPv4 还是 IPv6 地址。
在此修复之前,远程节点主机名的 DNS 查找确定了要使用的 IP 版本,这意味着主机名必须解析为有效的 IP 地址。
自有 ID:OTP-17809 辅助 ID:PR-5337 GH-5334
改进和新功能
自有 ID:OTP-17375 辅助 ID:PR-4663 PR-5186
添加套接字设备控制的套接字函数 ioctl/2,3,4。
自有 ID:OTP-17528
为 gen_tcp_socket 和 gen_udp_socket 添加了对 socknames/1 的简单支持。
自有 ID:OTP-17531
在
gen_statem
中,回调结果类型的类型已通过元数为 2 的类型进行了扩充,其中回调模块可以指定回调数据的类型,以便回调模块可以获得它的类型验证。自有 ID:OTP-17738 辅助 ID:PR-4926、OTP-17589
Kernel 8.1.3
已修复的 Bug 和故障
已修复内部、未记录但已使用的模块
inet_dns
,以处理 Class 字段的 mDNS 高位使用。使用先前过时、未记录且未使用的记录字段
#dns_rr.func
的代码需要更新,因为该字段现在用作 mDNS 高 Class 位的布尔标志。使用同样未记录的记录#dns_query
的代码需要重新编译,因为已为 mDNS 高 Class 位添加了布尔字段#dns_query.unicast_response
。*潜在的不兼容性*
自有 ID:OTP-17734 辅助 ID:GH-5327、OTP-17659
在 OTP-24.1.2 中发布的 PR-5120 中,针对 Linux 在重新连接 UDP 套接字时的行为的修复已得到改进,仅在套接字已连接的情况下,即仅在重新连接时,才在连接之前断开套接字的连接。
这允许代码使用临时端口打开套接字,获取端口号并连接;而端口号不会更改(在 Linux 上)。事实证明,这至少有一个有效的用例(除了测试用例外)。
如果重新连接套接字,则端口号可能会在 Linux 上更改;这是一个已知的怪癖,可以通过在打开套接字时绑定到特定端口号来解决。如果可以不用临时端口,那就好了...
自有 ID:OTP-17736 辅助 ID:GH-5279、PR-5120、OTP-17559
Kernel 8.1.2
已修复的 Bug 和故障
已清理未记录的 DNS 编码/解码模块
inet_dns
,以便以更一致的方式处理“符号”记录和“原始”记录之间的差异。PR-5145/OTP-17584 引入了一个变更,加剧了已经存在的混淆,此更正旨在补救这种情况。
自有 ID:OTP-17659 辅助 ID:ERIERL-702
Kernel 8.1.1
修复的 Bug 和故障
当监视套接字时,为 DOWN 消息添加更多关于套接字“类型”(“socket”或“port”)的信息。
自有 ID:OTP-17640
Kernel 8.1
修复的 Bug 和故障
以下 BIF 的扩展错误信息已得到更正和改进:
binary_to_existing_atom/2
,list_to_existing_atom/1
,erlang:send_after/{3,4}
, 和erlang:start_timer/{3,4}
.自有 ID:OTP-17449 辅助 ID:GH-4900
修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。
自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934
改进了对 inet:info/1 的已关闭套接字的处理。
自有 ID:OTP-17492
此更改修复了在 pull-request #2675 中引入的性能问题。Pull-request #2675 使得系统尝试启动已启动应用程序的子项,这是不必要的。此更改修复了此性能问题。
自有 ID:OTP-17519
修复了当模块位于 escript 中时 code:get_doc/1 会崩溃的问题。
自有 ID:OTP-17570 辅助 ID:PR-5139 GH-4256 ERL-1261
原生 DNS 解析器中对结果值的解析已加强了防御能力,以防止不正确的结果。
自有 ID:OTP-17578 辅助 ID:ERIERL-683
修复了旧式套接字适配器的选项处理中的一个 Bug,即当使用
inet_backend = socket
时。现在,套接字选项在 bind() 调用之前设置,因此例如关于地址重用的选项具有预期的效果。自有 ID:OTP-17580 辅助 ID:GH-5122
inet:ntoa/1
已修复为不接受无效的数字地址。自有 ID:OTP-17583 辅助 ID:GH-5136
改进了对已知类型的 DNS 记录的解析,以不接受并以原始格式呈现格式错误的记录。
自有 ID:OTP-17584 辅助 ID:PR-5145
{ip,add_membership}
和{ip,drop_membership}
套接字选项的ip_mreq()
类型已更正为具有interface
字段,而不是错误地具有address
字段。自有 ID:OTP-17590 辅助 ID:PR-5170
改进和新功能
添加了一个简单的实用函数,用于在 erlang shell 中显示现有套接字 (socket:i/0)。
自有 ID:OTP-17376 辅助 ID:OTP-17157
gen_udp 现在可以配置为使用套接字 inet-backend(与 gen_tcp 相同的方式)。
自有 ID:OTP-17410
添加了函数
erlang:set_cookie(Cookie)
和erlang:get_cookie(Node)
,以完善功能并方便配置具有不同 cookie 的分布式节点。关于分发 cookie 的文档已得到改进,不再那么含糊不清。
自有 ID:OTP-17538 辅助 ID:GH-5063, PR-5111
针对 Linux 的怪异行为(当连接连接的(重新连接的)UDP 套接字时,不调整源 IP 地址)实施了解决方法。
解决方法是,在 Linux 上,始终在连接 UDP 套接字之前解除任何连接。
自有 ID:OTP-17559 辅助 ID:GH-5092, PR-5120
记录了我们关于不建议使用
file:open/2
打开 NFS 挂载的文件、FIFO、设备和类似文件的建议。自有 ID:OTP-17576 辅助 ID:ERIERL-685
Kernel 8.0.2
修复的 Bug 和故障
对于
gen_tcp:connect/3,4
,可以指定特定的源端口,这应该足以在连接之前将套接字绑定到具有该端口的地址。不幸的是,该功能在 OTP-17216 中丢失了,该版本强制指定源地址以获取地址绑定,并且如果未指定源地址,则忽略指定的源端口。
该 Bug 现在已得到纠正。
自有 ID:OTP-17536 辅助 ID:OTP-17216, ERIERL-677
Kernel 8.0.1
修复的 Bug 和故障
修复了 Global 中的竞争条件。
自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923
在节点使用
init:restart/0,1
重启后,模块socket
不可用,因为支持表已被清除且未重新初始化。现在已修复此问题。将“.”域作为搜索域的处理不正确,导致 DNS 解析器
inet_res
崩溃,现在已修复此问题。自有 ID:OTP-17439 辅助 ID:GH-4827, PR-4888, GH-4838
更正了
fd
选项和绑定到地址的组合处理,特别是对于local
地址族。自有 ID:OTP-17451 辅助 ID:OTP-17374
新
socket
实现的 Bug 修复和代码清理,例如在适当的情况下,已在 NIF 代码中添加了对取消监视结果的断言。
已审查 NIF 代码中套接字关闭的内部状态处理。
已删除 NIF 代码中针对
EINTR
的close()
循环,因为在 Linux 上强烈建议不要这样做,并且 Posix 对于是否允许这样做并不明确。已记录旧式
gen_tcp
套接字的inet_backend
临时套接字选项。更正了
net:getaddrinfo/2
的返回值:protocol
字段现在是atom/0
,而不是错误地是list(atom())
。关于此返回类型的文档也已更正。延迟关闭
socket:sendfile/*
文件已损坏,现已更正。已更正套接字 NIF 中的一些调试代码(默认情况下未启用),以避免因调试打印或多或少无害的事件而意外地核心转储。
自有 ID:OTP-17452
Kernel 8.0
修复的 Bug 和故障
修复了内部
inet_res
解析器缓存的一个 Bug,该 Bug 错误地处理了解析器配置文件的状态计时器,并因许多不必要的文件系统访问而导致性能问题。自有 ID:OTP-14700 辅助 ID:PR-2848
将
disk_log:info/1
返回的标签head
的值从{ok, Head}
更改为仅Head
。*潜在的不兼容性*
自有 ID:OTP-16809 辅助 ID:ERL-1313
已向
erl_call
添加了两个选项。-fetch_stdout
选项获取erl_call
调用的代码产生的标准输出数据。-fetch_stdout
选项禁用结果项的打印。为了实现这两个选项中的第一个,已向 erl_interface 添加了一个名为ei_xrpc_from
的新函数。有关详细信息,请参阅erl_call
文档和erl_interface
文档。自有 ID:OTP-17132
已将缺少的运行时依赖项添加到此应用程序。
自有 ID:OTP-17243 辅助 ID:PR-4557
已更正
inet:get_rc/0
,以将主机条目作为单独的条目返回,而不是(错误地)在列表内的列表中返回。此 Bug 由 OTP-23.0-rc1 中的 OTP-16487 引入。自有 ID:OTP-17262 辅助 ID:GH-4588, PR-4604, OTP-16487
类型 gen_tcp:option_name() 有一个重复的 pktoptions 值。
自有 ID:OTP-17277
修复了从
pg
中的内部状态删除空组的问题。自有 ID:OTP-17286 辅助 ID:PR-4619
当
erl -remsh
无法连接到远程节点时,现在会打印错误消息。自有 ID:OTP-17287 辅助 ID:PR-4581
修复了与损坏的 shell 历史文件相关的 Bug。
shell 历史记录打印的错误消息现在作为记录器错误报告记录,而不是写入标准错误。
自有 ID:OTP-17288 辅助 ID:PR-4581
现在,当给
-name
或-sname
提供了太多参数时,会发出记录器警告。示例:erl -name a b
。自有 ID:OTP-17315 辅助 ID:GH-4626
inet_res
使用的缓存现在可以再次处理每个域名多个 IP 地址,从而修复了在 PR-3041 (OTP-13126) 和 PR-2891 (OTP-14485) 中引入的 Bug。自有 ID:OTP-17344 辅助 ID:PR-4633, GH-4631, OTP-14485, OTP-12136
使用 socket:accept 创建的套接字未计数 (socket:info/0)。
自有 ID:OTP-17372
gen_tcp:listen/2
的{fd, Fd}
选项不适用于inet_backend
socket
,现已修复。自有 ID:OTP-17374 辅助 ID:PR-4787, GH-4680, PR-2989, OTP-17216
改进和新功能
已改进 DNS 解析器
inet_res
使用的缓存,以使用 ETS 查找而不是服务器调用。这对于缓存命中来说是一个相当大的速度提升。自有 ID:OTP-13126 辅助 ID:PR-3041
内部 DNS 解析器
inet_res
的缓存 ETS 表类型(在内部)已更改类型,以获得更好的速度和原子性。自有 ID:OTP-14485 辅助 ID:PR-2891
实验性
socket
模块现在可以使用操作系统支持的任何协议(按名称)。在 PR-2641 中提出,在 PR-2670 中实现。自有 ID:OTP-14601 辅助 ID:PR-2641, PR-2670, OTP-16749
已更新 DNS 解析器
inet_res
,以支持 CAA (RFC 6844) 和 URI (RFC 7553) 记录。自有 ID:OTP-16517 辅助 ID:PR-2827
已实现用于
gen_tcp
以使用新的socket
API 的兼容性适配器 (gen_tcp_socket
)。在设置内核应用程序变量inet_backend = socket
时使用。自有 ID:OTP-16611 辅助 ID:OTP-16749
已实现 EEP 54 中提议的失败 BIF 调用的扩展错误信息,https://github.com/erlang/eep/blob/master/eeps/eep-0054.md。
当 Erlang shell 中的 BIF 调用失败时,将打印有关哪个或哪些参数出错的更多信息。当 BIF 调用失败时,
proc_lib
、common_test
和qlc
将使用相同的扩展错误信息。对于希望提供相同扩展错误信息的应用程序,有新的函数
erl_error:format_exception/3
和erl_error:format_exception/4
。现在有一个新的
error/3
BIF,它允许应用程序或库以相同的方式为它们自己的异常提供扩展的错误信息。内部 ID: OTP-16686
现在可以使用
raw
选项在file:delete/1,2
中绕过文件服务器。内部 ID: OTP-16698 辅助 ID: PR-2634
引入了使用分布进程通过 UDS 实现 Erlang 分布的示例。
感谢 Jérôme de Bretagne
内部 ID: OTP-16703 辅助 ID: PR-2620
引入了 进程别名 功能,如 EEP 53 中所述。引入它的目的是提供一种轻量级的机制,可以防止超时或连接丢失后出现延迟回复。更多信息,请参阅 EEP 53 以及新的
alias/1
BIF 和monitor/3
BIF 的新选项的文档。gen_server
、gen_statem
和gen_event
使用的框架中的call
操作已更新为利用别名来防止延迟响应。gen_statem
行为在分布式情况下仍然使用代理进程,因为它一直可以防止延迟回复,并且别名不能用于 OTP 24 之前的节点。代理进程可以在 OTP 26 中移除。别名功能还使得引入类似于
erpc:receive_response()
函数的 gen 行为中的新函数成为可能,因此也引入了新函数gen_server:receive_response()
、gen_statem:receive_response()
、gen_event:receive_response()
。内部 ID: OTP-16718 辅助 ID: PR-2735
实验性的新套接字 API 得到了进一步的开发。 相对于 OTP 23,进行了一些不向后兼容的更改。
控制消息格式已更改,因此解码后的值现在位于“value”字段中,而不是“data”字段中。“data”字段现在始终包含二进制数据。
一些类型名称已更改,涉及消息头和控制消息头。
socket:bind/2
现在返回纯ok
,而不是{ok, Port}
,后者仅与inet
和inet6
地址族相关,并且通常不有趣。 要找出选择了哪个端口,请使用socket:sockname/1
。*潜在的不兼容性*
内部 ID: OTP-16749 辅助 ID: OTP-14601
新函数
os:env/0
将所有操作系统环境变量作为 2 元组列表返回。内部 ID: OTP-16793 辅助 ID: ERL-1332, PR-2740
删除了对分布式磁盘日志的支持。新函数
disk_log:all/0
将代替disk_log:accessible_logs/0
使用。 函数disk_log:close/1
将代替disk_log:lclose/1,2
使用。*潜在的不兼容性*
内部 ID: OTP-16811
扩展了
erl_epmd:listen_port_please/2
的规范以镜像erl_epmd:port_please/2
。内部 ID: OTP-16947 辅助 ID: PR-2781
添加了一个新的 erl 参数,用于指定带有配置数据的文件描述符。这使得在执行 erl 命令时可以传递参数“-configfd FD”。 当给出此选项时,系统将尝试从文件描述符中读取和解析配置参数。
内部 ID: OTP-16952
实验性的 HiPE 应用程序已删除,以及其他应用程序中的所有相关功能。
*潜在的不兼容性*
内部 ID: OTP-16963
pg2
模块已删除。*潜在的不兼容性*
内部 ID: OTP-16968
接受来自远程节点的最大 160 位大小的引用。这是在未来的 OTP 版本中使用最大 160 位大小的引用的升级路径中的第一步。
内部 ID: OTP-17005 辅助 ID: OTP-16718
允许将 utf-8 二进制文件作为 logger_formatter 模板的一部分。
内部 ID: OTP-17015
如果首次打开包装日志,即磁盘日志进程不存在,并且选项
size
的值与磁盘日志的当前大小不匹配,则允许disk_log:open/1
更改大小。*潜在的不兼容性*
内部 ID: OTP-17062 辅助 ID: ERL-1418, GH-4469, ERIERL-537
允许使用自定义回调模块获取和存储 erlang 节点的 shell 历史记录。 有关更多详细信息,请参阅 内核文档 中的
shell_history
配置参数。内部 ID: OTP-17103 辅助 ID: PR-2949
已改进简单记录器(用于记录内核启动之前发生的事件),以打印更漂亮的错误消息。
内部 ID: OTP-17106 辅助 ID: PR-2885
对于支持底层套接字库调用的平台,已实现
socket:sendfile/2,3,4,5
。内部 ID: OTP-17154 辅助 ID: OTP-16749
为所有类型的套接字添加套接字监视器。
内部 ID: OTP-17155
修复了 gen_tcp_socket 的各种问题。 包括记录一些不兼容之处。
*潜在的不兼容性*
内部 ID: OTP-17156
inet:i/0 现在也显示现有的基于“socket”的 gen_tcp 兼容性套接字。
内部 ID: OTP-17157
在记录器中添加了对设置主元数据的支持。 主元数据作为基本元数据传递给系统中所有日志事件。 有关更多详细信息,请参阅内核用户指南的记录器章节中的 元数据。
内部 ID: OTP-17181 辅助 ID: PR-2457
识别应用程序资源文件中的新键“optional_applications”。
内部 ID: OTP-17189 辅助 ID: PR-2675
传递给 logger:log/2,3,4 的
Fun
现在可以返回仅在需要时才获取的元数据。 有关更多详细信息,请参阅logger:log/2,3,4
。内部 ID: OTP-17198 辅助 ID: PR-2721
erpc:multicall()
已重写,以便能够利用新引入和改进的选择性接收优化。内部 ID: OTP-17201 辅助 ID: PR-4534
添加实用函数 inet:info/1 以提供有关套接字的各种信息。
内部 ID: OTP-17203 辅助 ID: OTP-17156
gen_tcp:connect/3,4
的行为已更改为默认不绑定到地址,这允许网络堆栈将地址和端口选择延迟到已知远程地址时。 这允许更好地重用端口,从而启用更多的出站连接,因为临时端口范围不再需要是一个硬性限制。从理论上讲,此行为更改可能会影响可能的错误值集,或对某些平台产生其他细微影响。
*潜在的不兼容性*
内部 ID: OTP-17216 辅助 ID: PR-2989
DNS 解析器
inet_res
中实现了一个选项{nxdomain_reply, boolean()}
。 它很有用,因为来自名称服务器的nxdomain
错误确实包含 SOA 记录(如果域确实存在)。 此记录对于确定失败条目的负缓存的 TTL 很有用。内部 ID: OTP-17266 辅助 ID: PR-4564
优化了
pg
中作为组一部分的本地进程的查找。内部 ID: OTP-17284 辅助 ID: PR-4615
模块
socket
函数send()
、sendto()
、sendmsg()
、sendfile()
和recv()
的返回值已更改为在返回SelectInfo
时返回带有select
标记的元组,而不是有时带有ok
标记。这是一个不向后兼容的更改,它提高了使用异步操作的代码的可用性。
*潜在的不兼容性*
内部 ID: OTP-17355 辅助 ID: OTP-17154
修复了匹配以下划线前缀的变量的代码中的警告。
内部 ID: OTP-17385 辅助 ID: OTP-17123
内核 7.3.1.7
改进和新特性
引入了一个新函数
global:disconnect/0
,可以使用它来干净地断开节点与global
节点集群中所有其他节点的连接。自有 ID:OTP-18232 辅助 ID:OTP-17843,PR-6264
内核 7.3.1.6
修复的 Bug 和故障
在建立连接的同时调用
net_kernel:setopts(new, Opts)
可能会导致net_kernel
进程和建立连接的进程之间发生死锁。自有 ID:OTP-18198 辅助 ID:GH-6129,PR-6216
内核 7.3.1.5
修复的 Bug 和故障
默认情况下,当由于网络问题导致连接丢失时,
global
不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如mnesia
),以及global
本身,这都是有问题的。重叠分区的网络可能导致global
的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。为了防止此类问题,我们引入了一个防止重叠分区的修复程序,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用该修复程序。启用此修复程序后,global
将主动断开与报告已断开与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。请注意,为了正常工作,必须在网络中的所有节点上启用此修复程序。由于这会相当大地改变行为,因此目前默认情况下禁用此修复程序。但是,由于您可能会在没有此修复程序的情况下遇到难以检测到的问题,因此强烈建议您启用此修复程序以避免出现上述问题。从 OTP 25 开始,此修复程序将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611
修复了从同一节点静默关闭先前建立的连接后,接受连接设置失败的问题。
自有 ID:OTP-17979 辅助 ID:ERIERL-780
改进和新特性
引入了
net_tickintensity
kernel
参数。它可以用于控制在net_ticktime
期间的刻度数。还引入了新的
net_kernel:start/2
函数,以便更容易添加新选项。已弃用net_kernel:start/1
的使用。自有 ID:OTP-17905 辅助 ID:ERIERL-732、PR-5740
内核 7.3.1.4
修复的 Bug 和故障
原生 DNS 解析器中对结果值的解析已加强了防御能力,以防止不正确的结果。
自有 ID:OTP-17578 辅助 ID:ERIERL-683
内核 7.3.1.3
修复的 Bug 和故障
修复了当模块位于 escript 中时 code:get_doc/1 会崩溃的问题。
自有 ID:OTP-17570 辅助 ID:PR-5139 GH-4256 ERL-1261
内核 7.3.1.2
修复的 Bug 和故障
将“.”域作为搜索域的处理不正确,导致 DNS 解析器
inet_res
崩溃,现在已修复此问题。内部 ID: OTP-17473 辅助 ID: GH-4838, OTP-17439
修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。
自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934
内核 7.3.1.1
修复的 Bug 和故障
修复了 Global 中的竞争条件。
自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923
内核 7.3.1
修复的 Bug 和故障
Erlang DNS 解析器中存在一个 bug 已被修复。当从 DNS 服务器收到不正确的回复(对 IN CNAME 查询的 IN A 回复)并在未验证其类型的情况下使用回复记录的值时,该 bug 会导致内核 supervisor 崩溃,从而导致整个节点崩溃。
自有 ID:OTP-17361
内核 7.3
修复的 Bug 和故障
DNS 编码中压缩指针的范围检查存在缺陷,导致超大 DNS 消息(大于约 16 kBytes,例如 AXFR 响应)的标签压缩编码不正确。这个存在超过 11 年的 bug 现已修复。
自有 ID:OTP-13641 辅助 ID:PR-2959
修复了
erpc
文档中的内部链接。自有 ID:OTP-17202 辅助 ID:PR-4516
修复了复杂的 seq_trace 令牌(即列表、元组、映射等)可能被 GC 损坏的 bug。该 bug 在 OTP-21 中引入。
自有 ID:OTP-17209 辅助 ID:PR-3039
在
modules
模式下运行 Xref 时,Debugger 应用程序会显示为 Kernel 应用程序的依赖项。自有 ID:OTP-17223 辅助 ID:GH-4546, PR-4554
改进和新功能
erl_epmd
(epmd 客户端)现在会在连接断开时尝试重新连接到本地 EPMD。自有 ID:OTP-17178 辅助 ID:PR-3003
内核 7.2.1
修复的 Bug 和故障
当使用 DNS 解析器选项
servfail_retry_timeout
时,它没有遵守例如inet_res:getbyname/3
中的整体调用超时。此错误行为现已修复。此外,servfail_retry_timeout
的行为已得到改进,仅对提供 servfail 答案的服务器强制执行。自有 ID:OTP-12960 辅助 ID:ERIERL-598, PR-4509
内核 7.2
修复的 Bug 和故障
logger.hrl
中的apply
调用现在使用erlang
前缀调用,以避免与本地apply/3
函数冲突。自有 ID:OTP-16976 辅助 ID:PR-2807
修复了
pg
中的内存泄漏。自有 ID:OTP-17034 辅助 ID:PR-2866
修复了由于未处理的错误
gen_server:call
回复而导致的logger_proxy
崩溃。当记录器在高负载下且流量控制机制达到其限制时,会出现错误回复。自有 ID:OTP-17038
修复了
erl_epmd:names()
中的一个 bug,该 bug 导致它返回非法返回值noport
而不是{error, Reason}
,其中Reason
是实际的错误原因。这个 bug 也传播到了net_adm:names()
。此 bug 在
kernel
版本 7.1 (OTP 23.1) 中引入。自有 ID:OTP-17054 辅助 ID:ERL-1424
改进和新功能
添加了对一些已记录的解析器类型的导出。
自有 ID:OTP-16954 辅助 ID:ERIERL-544
为解析器查找添加了可配置的重试超时。
自有 ID:OTP-16956 辅助 ID:ERIERL-547
gen_server:multi_call()
在仅使用设置为infinity
的超时调用本地节点的特殊情况下进行了优化。自有 ID:OTP-17058 辅助 ID:PR-2887
内核 7.1
修复的 Bug 和故障
当使用 inet_backend 套接字时,已为 file:sendfile 实现了回退。
自有 ID:OTP-15187 辅助 ID:ERL-1293
使默认 TCP 分发遵守
inet_dist_listen_options
中的选项backlog
。自有 ID:OTP-16694 辅助 ID:PR-2625
实验性
gen_tcp_socket
后端的原始选项处理已损坏,因此所有原始选项都被gen_tcp:listen/2
等忽略了,此 bug 现已修复。由 Jan Uhlig 报告。自有 ID:OTP-16743 辅助 ID:ERL-1287
使用 inet-backend 套接字时,Accept 失败。
自有 ID:OTP-16748 辅助 ID:ERL-1284
修复了 gen_tcp 的套接字后端中的各种小错误。
自有 ID:OTP-16754
更正
disk_log:truncate/1
以计算标头。同时更正了文档,声明disk_log:truncate/1
可以与外部磁盘日志一起使用。自有 ID:OTP-16768 辅助 ID:ERL-1312
修复 erl_epmd:port_please/2,3 类型规范以包含所有可能的错误值。
自有 ID:OTP-16783
修复了
erl -erl_epmd_port
以使其正常工作。在此修复之前,它根本不起作用。自有 ID:OTP-16785
修复内部函数
erlang:seq_trace_info/1
的类型规范,以允许term/0
作为返回的标签。这反过来修复了seq_trace:get_token/1
的调用,以便可以由 dialyzer 正确分析。自有 ID:OTP-16823 辅助 ID:PR-2722
修复了在动态启动分发时
pg
中进程的错误重复注册。自有 ID:OTP-16832 辅助 ID:PR-2738
改进和新功能
使套接字注册表成为可选的(默认情况下仍启用)。现在可以使用关闭的套接字注册表构建 OTP,可以通过设置环境变量和在运行时(通过函数调用和创建套接字时的参数)控制它。
自有 ID:OTP-16763
当与动态节点名一起使用时,
erl -remsh nodename
不再需要提供主机名。自有 ID:OTP-16784
内核 7.0
修复的 Bug 和故障
修复了启用
shell_history
时关闭期间的竞争条件。此竞争条件会导致disk_log
崩溃。自有 ID:OTP-16008 辅助 ID:PR-2302
修复了 Erlang 分发,以处理节点连接时可以处理消息分片但不能处理原子缓存的情况。此 bug 仅影响已实现自定义分发载体的用户。它自 OTP-21 起就存在。
DFLAG_FRAGMENT
分发标志已添加到分发实现可以拒绝的标志集中。自有 ID:OTP-16284
修复了二进制文件不允许作为
logger:log
调用中的格式字符串的 bug。自有 ID:OTP-16395 辅助 ID:PR-2444
修复了
logger
在尝试记录处理程序或格式化程序崩溃时最终进入无限循环的 bug。自有 ID:OTP-16489 辅助 ID:ERL-1134
code:lib_dir/1
已修复,也可返回erts
的 lib 目录。这已被标记为与任何依赖于为
erts
返回{error,bad_name}
的应用程序不兼容。*潜在的不兼容性*
自有 ID:OTP-16502
如果应用程序的主应用程序终止,则不会调用应用程序
stop/1
回调。自有 ID:OTP-16504 辅助 ID:PR-2328
修复了
application:loaded_applications/0
中的一个 bug,如果例如正在运行并发升级/降级,可能会导致它失败并返回badarg
。自有 ID:OTP-16627 辅助 ID:PR-2601
改进和新功能
在
kernel
应用程序中引入了一个新的模块erpc
。erpc
模块实现了rpc
模块提供的操作的增强子集。增强之处在于它使得可以区分返回值、引发的异常和其他错误。erpc
还比原始rpc
实现具有更好的性能和可扩展性。这是通过利用新引入的spawn_request()
BIF 来实现的。此外,rpc
模块在可能的情况下通过利用erpc
也从这些改进中受益。此更改已被标记为潜在的不兼容,因为
rpc:block_call()
现在仅保证阻止其他block_call()
操作。该文档之前声称它会阻止所有rpc
操作。但这从来都不是这种情况。它以前不会阻止节点本地block_call()
操作。*潜在的不兼容性*
自有 ID:OTP-13450 辅助 ID:OTP-15251
客户端节点可以从其首次连接的节点动态接收其节点名称。此功能可以通过以下方式使用
- 使用
erl -sname undefined
启动 - erl_interface 函数
ei_connect_init
及其友元 erl_call -R
自有 ID:OTP-13812
- 使用
改进了 STDLIB 和 Kernel 中大多数 OTP 行为的单行记录器事件的打印输出。这包括
proc_lib
、gen_server
、gen_event
、gen_statem
、gen_fsm
、supervisor
、supervisor_bridge
和application
。改进了
proc_lib
中以及格式化异常时对chars_limit
和depth
的处理。自有 ID:OTP-15299
删除 I/O 协议的旧请求的使用和文档。
自有 ID:OTP-15695
现在可以通过传递
directory
选项使用file:open/2
打开目录。自有 ID:OTP-15835 辅助 ID:PR-2212
通过使用
persistent_term
存储日志级别,优化了logger
中基于日志级别是否记录的检查。自有 ID:OTP-15948 辅助 ID:PR-2356
file:read_file_info/2
现在可以用于打开的文件和目录。自有 ID:OTP-15956 辅助 ID:PR-2231
现在
erl
的-config
选项可以采用多个配置文件,而无需重复-config
选项。示例erl -config sys local
自有 ID:OTP-16148 辅助 ID:PR-2373
改进了节点连接设置握手协议。使在不依赖
epmd
或其他对等节点版本预先了解的情况下就协议版本达成一致成为可能。还添加了节点化身(“创建”)值的交换,并将分发能力标志字段从 32 位扩展到 64 位。自有 ID:OTP-16229
扩展了在不依赖 EPMD 的情况下运行 Erlang 分发的可能性。为了实现这一点,为 inet 分发添加了一些新选项。
-dist_listen false - 设置分布式通道,但不监听传入的连接。当您希望使用当前节点与同一台机器上的另一个节点交互,而无需加入整个集群时,此选项非常有用。
-erl_epmd_port Port - 配置内置 EPMD 客户端应返回的默认端口。这允许本地节点知道要连接到集群中任何其他节点的端口。
erl_epmd
回调 API 也已扩展,允许返回-1
作为创建值,这意味着节点将创建随机的创建值。此外,还添加了一个名为
listen_port_please
的新回调函数,允许回调返回分布式应使用的监听端口。如果要从外部服务获取监听端口,则可以使用此函数代替inet_dist_listen_min/max
。自身 ID:OTP-16250
第一个实验性模块已经实现,它是
gen_tcp
和inet
的socket
后端。后续会跟进其他模块。欢迎提供反馈。自身 ID:OTP-16260 辅助 ID:OTP-15403
新的实验性
socket
模块已移至 Kernel 应用程序。自身 ID:OTP-16312
替换
group
模块中已弃用函数的使用。自身 ID:OTP-16345
由于新的 spawn 改进,进行了小的更新。
自身 ID:OTP-16368 辅助 ID:OTP-15251
更新了顺序跟踪,以支持消息传递以外的其他信息传输。
自身 ID:OTP-16370 辅助 ID:OTP-15251, OTP-15232
code:module_status/1
现在接受模块列表。code:module_status/0
已添加,它返回所有已加载模块的状态。自身 ID:OTP-16402
当模式中包含双星号 (
**
) 时,filelib:wildcard/1,2
现在速度提高了一倍。自身 ID:OTP-16419
引入了分布式命名进程组的新实现。它在
pg
模块中可用。请注意,此
pg
模块仅与 OTP 17 之前的stdlib
中存在的实验性pg
模块名称相同。感谢 Maxim Fedorov 的实现。
自身 ID:OTP-16453 辅助 ID:PR-2524
pg2
模块已被弃用。它也计划在 OTP 24 中移除。建议您使用新引入的
pg
模块替换pg2
的使用。pg
具有类似的 API,但具有更具可扩展性的实现。*潜在的不兼容性*
自身 ID:OTP-16455
重构了已弃用和已删除函数的内部处理。
自身 ID:OTP-16469
内部主机文件解析器缓存
inet_hosts
已被重写,以便在主机文件更改时更好地工作。例如,缓存是按条目更新,而不是清除和重新加载,因此在重新加载期间查找不会暂时失败;并且当多个进程同时请求重新加载时,这些请求现在被合并为一个,而不是按顺序完成。由 Maxim Fedorov 报告并首次提出解决方案建议。自身 ID:OTP-16487 辅助 ID:PR-2516
添加了
code:all_available/0
,可用于获取所有可用的模块。自身 ID:OTP-16494
从 OTP 23 开始,分布式
disk_log
功能已被弃用。它也计划在 OTP 24 中移除。*潜在的不兼容性*
自身 ID:OTP-16495
添加了函数
code:fetch_docs/1
,用于获取 Erlang 模块的嵌入式文档。自身 ID:OTP-16499
改进了 net nif 的配置,这将提高可移植性。
自身 ID:OTP-16530 辅助 ID:OTP-16464
socket: socket 计数器和 socket 全局计数器现在表示为映射(而不是属性列表)。
自身 ID:OTP-16535
实验性 socket 模块已取消限制,因此现在“seqpacket” socket 类型应该适用于 OS 支持的任何通信域(协议族),通常是 Unix 域。
自身 ID:OTP-16550 辅助 ID:ERIERL-476
允许在
logger_std_h
中使用自定义 IO 设备。自身 ID:OTP-16563 辅助 ID:PR-2523
添加了
file:del_dir_r/1
,它会删除一个目录及其所有内容,类似于 Unix 系统上的rm -rf
。自身 ID:OTP-16570 辅助 ID:PR-2565
socket:默认情况下,socket 选项 rcvtimeo 和 sndtimeo 现在已禁用。要启用这些选项,现在必须使用配置选项 --enable-esock-rcvsndtimeo 构建 OTP。
自身 ID:OTP-16620
当接收指定数量的字节时,利用 socket 模块的实验性 gen_tcp 兼容代码可能会丢失缓冲的数据。此错误已修复。由 Maksim Lapshin 在 bugs.erlang.org ERL-1234 上报告。
自身 ID:OTP-16632 辅助 ID:ERL-1234
Kernel 6.5.2.5
修复的错误和故障
默认情况下,当由于网络问题导致连接丢失时,
global
不会采取任何措施来恢复完全连接的网络。对于所有期望提供完全连接网络的应用程序(例如mnesia
),以及global
本身,这都是有问题的。重叠分区的网络可能导致global
的内部状态不一致。即使在将这些分区合并在一起形成完全连接的网络之后,这种不一致性也可能仍然存在。对期望维护完全连接网络的其他应用程序的影响可能会有所不同,但在这种分区期间,它们可能会以非常微妙且难以检测的方式发生错误。为了防止此类问题,我们引入了一个防止重叠分区的修复,可以使用
prevent_overlapping_partitions
kernel(6)
参数启用。启用此修复后,global
将主动断开与报告已失去与其他节点连接的节点的连接。这将导致形成完全连接的分区,而不是使网络处于重叠分区的状态。请注意,此修复必须在网络中的所有节点上启用才能正常工作。由于这会相当大地改变行为,因此此修复目前默认禁用。由于如果没有此修复,您可能会遇到难以检测到的问题,因此强烈建议您启用此修复,以避免出现上述问题。从 OTP 25 开始,此修复将默认启用。自有 ID:OTP-17843 辅助 ID:ERIERL-732、PR-5611
改进和新功能
引入了
net_tickintensity
kernel
参数。它可用于控制net_ticktime
期间的 tick 次数。还引入了新的
net_kernel:start/2
函数,以便更容易添加新选项。已弃用net_kernel:start/1
的使用。自有 ID:OTP-17905 辅助 ID:ERIERL-732、PR-5740
Kernel 6.5.2.4
修复的错误和故障
修复了罕见的 Bug,该 Bug 可能导致 net_kernel 进程永远挂起。据观察,当远程节点重启时,使用大量 TLS 连接会发生这种情况。该 Bug 自 OTP-22.0 以来就存在。
自有 ID:OTP-17476 辅助 ID:GH-4931, PR-4934
Kernel 6.5.2.3
修复的错误和故障
修复了 Global 中的竞争条件。
自有 ID:OTP-16033 辅助 ID:ERIERL-329, ERL-1414, GH-4448, ERL-885, GH-3923
Kernel 6.5.2.2
修复的错误和故障
在
modules
模式下运行 Xref 时,Debugger 应用程序会显示为 Kernel 应用程序的依赖项。自有 ID:OTP-17223 辅助 ID:GH-4546, PR-4554
Kernel 6.5.2.1
修复的错误和故障
修复了
application:loaded_applications/0
中的一个 bug,如果例如正在运行并发升级/降级,可能会导致它失败并返回badarg
。自有 ID:OTP-16627 辅助 ID:PR-2601
Kernel 6.5.2
修复的错误和故障
DNS 解析器 `inet_res` 已修复,以便在后续请求超时时返回最后一个中间错误。
自身 ID:OTP-16414 辅助 ID:ERIERL-452
prim_net nif (net/kernel) 使用了未定义的原子 notsup。现在已更正。
自身 ID:OTP-16440
修复了在早期启动期间尝试在加载文件时记录故障时发生的崩溃。
自身 ID:OTP-16491
修复了在启动期间记录到远程节点时 logger 中发生的崩溃。
自身 ID:OTP-16493 辅助 ID:ERIERL-459
改进和新功能
改进了
net_kernel
调试功能。自身 ID:OTP-16458 辅助 ID:PR-2525
Kernel 6.5.1
修复的错误和故障
inet info 函数提供的“socket 状态”信息已得到改进
自身 ID:OTP-16043 辅助 ID:ERL-1036
修复了当需要轮换和压缩非常大的日志文件时,
logger
在启动时崩溃的错误。自身 ID:OTP-16145 辅助 ID:ERL-1034
修复了导致
net_kernel:monitor_nodes(true, [nodedown_reason])
报告的实际节点关闭原因丢失并被原因killed
替换的错误。自身 ID:OTP-16216
已更新
rpc:call/4,5/
的文档,以描述当被调用的函数抛出或返回'EXIT'
元组时会发生什么。自身 ID:OTP-16279 辅助 ID:ERL-1066
Kernel 6.5
修复的错误和故障
已更正
gen_sctp:connect/4,5
的类型规范。自身 ID:OTP-15344 辅助 ID:ERL-947
提供给
erl
的额外-mode
标志将被忽略,并发出警告。自身 ID:OTP-15852
修复
seq_trace:set_token/2
的类型规范。自身 ID:OTP-15858 辅助 ID:ERL-700
如果给定值
all
或none
作为任何参数,则logger:compare_levels/2
将会失败并出现badarg
异常。现在已更正。自身 ID:OTP-15942 辅助 ID:PR-2301
修复了当文件 inode 更改时,
logger_std_h
中的日志文件不会关闭的错误。这反过来会在使用 logrotate 等工具时导致文件描述符泄漏。自有 ID: OTP-15997 辅助 ID: PR-2331
修复调试函数
net_kernel:nodes_info/0
中的竞态条件。自有 ID: OTP-16022
修复在
compressed
或delayed_write
模式下关闭打开的文件时的竞态条件。自有 ID: OTP-16023
改进和新特性
向
gen_udp:send/4,5
添加了发送辅助数据的可能性,特别是 TOS 字段。自有 ID: OTP-15747 辅助 ID: ERIERL-294
如果日志文件使用相对路径给出,则标准日志处理程序 (
logger_std_h
) 将以相对路径存储文件名。如果节点当前目录随后被更改,则将相对于新的当前目录创建新文件,如果新目录不存在,则可能会因enoent
错误而失败。现在已对此进行更正,logger_std_h
始终将日志文件名存储为绝对路径,该路径从处理程序启动时的当前目录计算得出。自有 ID: OTP-15850
支持使用 inet:i/0 的本地套接字。
自有 ID: OTP-15935 辅助 ID: PR-2299
Kernel 6.4.1
已修复的 Bug 和故障
user
/user_drv
可能会在 IO 请求被处理之前响应它们,如果在调用io:format/2
后不久(例如在 escript 中)模拟器停止,可能会导致数据丢失。自有 ID: OTP-15805
Kernel 6.4
已修复的 Bug 和故障
修复当向
erl
提供多个-sname
或-name
时,选择第一个。在此修复之前,当给出多个名称选项时,根本不会启动分布式。自有 ID: OTP-15786 辅助 ID: ERL-918
修复指向不存在文件的
inet_res
配置以使其再次工作。这在 KERNEL-6.3 (OTP-21.3) 中被破坏。自有 ID: OTP-15806
改进和新特性
通过 socket 模块提供了一个简单的套接字 API。这是一个底层的 API,它不会取代 gen_[tcp|udp|sctp]。它的目的是最终取代 inet 驱动程序,而不是高级 gen 模块(gen_tcp、gen_udp 和 gen_sctp)。它还提供了一个基本的 API,方便实现其他协议,即 TCP、UDP 和 SCTP。
已知问题是:不(当前)支持 Windows 操作系统。
自有 ID: OTP-14831
改进了对 linger 选项的文档说明。
自有 ID: OTP-15491 辅助 ID: PR-2019
在连接到其他节点时,全局不再尝试多次。
自有 ID: OTP-15607 辅助 ID: ERIERL-280
dist 消息 EXIT、EXIT2 和 MONITOR_DOWN 已使用新版本更新,这些新版本将原因项作为消息有效负载的一部分发送,而不是作为控制消息的一部分发送。
旧版本仍然存在,并且可以在与不支持新版本的节点通信时使用。
自有 ID: OTP-15611
添加了 Kernel 配置参数
start_distribution = boolean()
。如果设置为false
,则系统启动时将禁用所有分布式功能。默认为true
。自有 ID: OTP-15668 辅助 ID: PR-2088
在 OTP-21.3 中,引入了针对配置中重复的应用程序/键的警告。当配置在系统启动时作为文件给出时,以及在运行时通过
application:set_env/1,2
时,都会显示此警告。现在,该警告在
application:set_env/1,2
中更改为badarg
异常。如果在系统启动时在配置文件中给出了错误的配置,则启动将失败。*潜在的不兼容性*
自有 ID: OTP-15692 辅助 ID: PR-2170
Kernel 6.3.1.3
已修复的 Bug 和故障
修复了当文件 inode 更改时,
logger_std_h
中的日志文件不会关闭的错误。这反过来会在使用 logrotate 等工具时导致文件描述符泄漏。自有 ID: OTP-15997 辅助 ID: PR-2331
Kernel 6.3.1.2
改进和新特性
向
gen_udp:send/4,5
添加了发送辅助数据的可能性,特别是 TOS 字段。自有 ID: OTP-15747 辅助 ID: ERIERL-294
Kernel 6.3.1.1
已修复的 Bug 和故障
修复
seq_trace:set_token/2
的类型规范。自身 ID:OTP-15858 辅助 ID:ERL-700
Kernel 6.3.1
已修复的 Bug 和故障
修复了读取使用
compressed
标志打开的文件时的性能下降问题。自有 ID: OTP-15706 辅助 ID: ERIERL-336
Kernel 6.3
已修复的 Bug 和故障
例如,如果
/etc/hosts
在内核应用程序启动后才出现,则永远不会读取其内容。此 Bug 现已得到纠正。自有 ID: OTP-14702 辅助 ID: PR-2066
修复了在另一个进程正在进行垃圾回收时执行
seq_trace:reset_trace()
可能会导致运行时系统崩溃的 Bug。自有 ID: OTP-15490
修复
erl_epmd:port_please
规范以包含atom/0
和string/0
。自有 ID: OTP-15557 辅助 ID: PR-2117
Logger 处理程序 logger_std_h 现在会跟踪其日志文件的 inode,以便在 inode 更改时重新打开该文件。例如,如果日志文件被编辑器打开和保存,则可能会发生这种情况。
自有 ID: OTP-15578 辅助 ID: ERL-850
当将用户特定的文件模式提供给日志处理程序
logger_std_h
时,它们早先在没有任何控制的情况下被接受。现在对此进行了更改,因此 Logger 将按如下方式调整文件模式- 如果列表中未找到
raw
,则会添加它。
- 如果列表中没有找到write
、append
或exclusive
,则会添加append
。
- 如果列表中没有找到delayed_write
或{delayed_write,Size,Delay}
,则会添加delayed_write
。自有 ID: OTP-15602
改进和新特性
标准日志处理程序
logger_std_h
现在具有用于日志轮换的新内部功能。轮换方案如下处理程序当前写入的日志文件始终具有相同的名称,即为处理程序配置的名称。存档文件具有相同的名称,但带有扩展名“.N”,其中 N 是一个整数。最新的存档的扩展名为“.0”,而最旧的存档的编号最高。
日志文件轮换的大小以及保留的存档文件数,分别使用处理程序特定的配置参数
max_no_bytes
和max_no_files
指定。存档可以压缩,在这种情况下,它们会在整数后获得“.gz”文件扩展名。压缩使用处理程序特定的配置参数
compress_on_rotate
指定。自有 ID: OTP-15479
添加了新函数
logger:i/0
和logger:i/1
。这些函数提供与logger:get_config/0
和其他logger:get_*_config
函数相同的信息,但信息更符合逻辑排序且更易读。自有 ID: OTP-15600
Logger 现在可以防止由于来自模拟器或远程节点的大量日志事件而导致的过载。
自有 ID: OTP-15601
Logger 现在使用 os:system_time/1 而不是 erlang:system_time/1 来生成日志事件时间戳。
自有 ID: OTP-15625
添加函数
application:set_env/1,2
和application:set_env/2
。这些函数接受应用程序配置参数列表,其行为等同于为每个应用程序/键组合单独调用application:set_env/4
,只是效率更高。set_env/1,2
会警告重复的应用程序或键。如果在启动期间,应用程序或键在一个配置文件(例如 sys.config)中重复,也会发出此警告。自有 ID: OTP-15642 辅助 ID: PR-2164
更改了标准处理程序
logger_std_h
的处理程序特定配置参数,使其更加直观,并且更类似于 disk_log 处理程序。早期只有一个参数
type
,它可以具有值standard_io
、standard_error
、{file,FileName}
或{file,FileName,Modes}
。现在对此进行了更改,因此允许以下参数
type = standard_io | standard_error | file
file = file:filename()
modes = [file:mode()]
所有参数都是可选的。
type
默认为standard_io
,除非给出了文件名,在这种情况下,它默认为file
。如果type
设置为file
,则文件名默认为与处理程序 ID 相同。潜在的不兼容之处在于,即使配置是使用旧变体设置的,例如
#{type=>{file,FileName}}
,logger:get_config/0
和logger:get_handler_config/1
现在也会返回新的参数。*潜在的不兼容性*
自有 ID: OTP-15662
将新的配置参数
file_check
添加到 Logger 处理程序logger_std_h
。此参数指定处理程序在检查日志文件是否仍然存在且 inode 与打开时相同时,可以等待多长时间(以毫秒为单位)。默认值为 0,表示在每次写入操作之前都会执行此检查。设置更高的数值可能会提高性能,但会增加丢失日志事件的风险。
自有 ID:OTP-15663
Kernel 6.2.1
修复的错误和故障
设置 inet 套接字的
recbuf
大小时,buffer
也会自动增加。修复了即使已显式设置 inet 缓冲区大小,也会触发 inet 缓冲区大小自动调整的错误。自有 ID:OTP-15651 辅助 ID:ERIERL-304
Kernel 6.2
修复的错误和故障
添加了一个新函数
logger:update_handler_config/3
,并且处理程序回调changing_config
现在有一个新参数SetOrUpdate
,它指示配置更改是来自set_handler_config/2,3
还是update_handler_config/2,3
。这允许处理程序将新配置与旧配置(如果更改来自
update_handler_config/2,3
)或默认配置(如果更改来自set_handler_config/2,3
)一致地合并。内置处理程序
logger_std_h
和logger_disk_log_h
已相应更新。还纠正了一个可能导致处理程序的内部状态与存储的配置之间不一致的错误。*潜在的不兼容性*
自有 ID:OTP-15364
修复了当自定义 erl_epmd 客户端未实现 address_please 时回退的问题。
自有 ID:OTP-15388 辅助 ID:PR-1983
logger ets 表格没有
read_concurrency
选项。现在已添加。自有 ID:OTP-15453 辅助 ID:ERL-782
在系统启动期间,logger 有一个简单的处理程序,它将输出打印到 stdout。内核监管启动后,此处理程序将被删除并替换为默认处理程序。由于一个错误,logger 之前会发出调试打印输出,表明它收到了意外的消息,即来自简单处理程序进程的 EXIT 消息。现在已更正。简单处理程序的进程现在在终止之前会从 logger 进程取消链接。
自有 ID:OTP-15466 辅助 ID:ERL-788
如果删除 logger 处理程序
logger_std_h
,则不会重新创建其日志文件。因此,它不能与 'logrotate' 等工具一起使用。现在已更正。自有 ID:OTP-15469
改进和新功能
添加了一个函数
inet:getifaddrs/1
,它接受一个带有命名空间选项的列表,适用于支持该功能的平台,例如 Linux(仅限?)自有 ID:OTP-15121 辅助 ID:ERIERL-189,PR-1974
为 TCP 套接字添加了
nopush
选项,它对应于 *BSD 上的TCP_NOPUSH
和 Linux 上的TCP_CORK
。这也用于
file:sendfile
的内部,以减少后续发送操作的延迟。自有 ID:OTP-15357 辅助 ID:ERL-698
优化了 TCP 套接字的 send_delay 处理,以更好地与 OTP-21 中引入的新 pollthread 实现配合使用。
自有 ID:OTP-15471 辅助 ID:ERIERL-229
Kernel 6.1.1
修复的错误和故障
修复了导致 net_kernel 进程在从名称与本地节点相同的节点尝试连接时崩溃的错误。
自有 ID:OTP-15438 辅助 ID:ERL-781
Kernel 6.1
修复的错误和故障
值
all
和none
被记录为 Kernel 配置参数logger_level
的有效值,但会导致节点启动时崩溃。现在已更正。自有 ID:OTP-15143
修复了节点间分发连接上发送刻度的某些潜在错误行为。即使有未发送的缓冲数据,现在也会向 c 节点发送刻度,因为 c 节点需要刻度才能发送回复刻度。当由于未发送的缓冲数据而抑制刻度时,发送的数据量计算也错误。
自有 ID:OTP-15162 辅助 ID:ERIERL-191
dist_util.erl 中非语义更改,以消除 dialyzer 警告。
自有 ID:OTP-15170
修复了
net_kernel:connect_node(node())
以返回true
(并且不执行任何操作),因为它在 OTP-21.0 之前一直如此。还将这种成功的“自我连接”记录为预期行为。自有 ID:OTP-15182 辅助 ID:ERL-643
logger_formatter 上的 single_line 选项在某些情况下会在映射中的关联箭头后添加不需要的逗号。现在已更正。
自有 ID:OTP-15228
提高了分发连接设置的稳健性。在 OTP-21.0 中,引入了真正的异步连接设置。这是对该工作的进一步改进,以使模拟器更加稳健,并且能够在涉及的 Erlang 进程行为不端时进行恢复。
自有 ID:OTP-15297 辅助 ID:OTP-15279,OTP-15280
改进和新功能
添加了一个新宏
?LOG(Level,...)
。这等效于现有的?LOG_<LEVEL>(...)
宏。添加了 Logger 报告回调的新变体,它接受一个额外的参数,其中包含大小限制和换行符的选项。
STDLIB
中的模块proc_lib
将其用于崩溃报告。现在对 Logger 配置进行了更多错误检查。
自有 ID:OTP-15132
套接字模块中已实现套接字选项
recvtos
、recvttl
、recvtclass
和pktoptions
。有关详细信息,请参阅gen_tcp
、gen_udp
和inet
模块的文档。请注意,运行时系统中对这些选项的支持取决于平台。特别是对于pktoptions
,它是 Linux 特有的,并且已被定义它的 RFC 弃用。自有 ID:OTP-15145 辅助 ID:ERIERL-187
添加
logger:set_application_level/2
用于设置一个应用程序中所有模块的日志级别。自有 ID:OTP-15146
Kernel 6.0.1
修复的错误和故障
修复了
net_kernel
中的一个错误,该错误可能在某些连接尝试失败时导致模拟器崩溃。该错误自 kernel-6.0 (OTP-21.0) 起就已存在。自有 ID:OTP-15280 辅助 ID:ERIERL-226,OTP-15279
Kernel 6.0
修复的错误和故障
澄清了
rpc:multicall/5
的文档。自有 ID:OTP-10551
DNS 解析器在从服务器获取 econnrefused 时保留了无效的套接字,因此对下一个服务器的查找也失败了。
自有 ID:OTP-13133 辅助 ID:PR-1557
没有任何解析器后端再返回 V4Mapped IPv6 地址。以前这不一致,有些返回,有些不返回。为了方便使用此类地址,添加了一个新函数
inet:ipv4_mapped_ipv6_address/1
。*潜在的不兼容性*
自有 ID:OTP-13761 辅助 ID:ERL-503
已根据文件和套接字操作应能够返回的错误更新了
file:posix/0
和inet:posix/0
的类型规范。自有 ID:OTP-14019 辅助 ID:ERL-550
修复了在进行初始分布式连接时,仅在 IPv6 环境中的名称解析问题。
自有 ID:OTP-14501
文件操作过去接受包含空字符(整数值零)的 文件名。这会导致名称被截断,并且在某些情况下,原始操作的参数会被混淆。现在拒绝包含空字符的文件名,并且会导致原始文件操作失败。
此外,环境变量操作过去接受包含空字符(整数值零)的环境变量的 名称 和 值。这会导致操作静默地产生错误的结果。现在拒绝包含空字符的环境变量名称和值,并且会导致环境变量操作失败。
原始环境变量操作还过去接受环境变量名称中的
$=
字符,从而导致各种问题。现在也拒绝环境变量名称中的$=
字符。从现在开始,
erlang:open_port/2
也将拒绝端口名称中的空字符。*潜在的不兼容性*
自有 ID:OTP-14543 辅助 ID:ERL-370
os:putenv
和os:getenv
不再直接访问进程环境,而是使用线程安全模拟。唯一可观察到的区别是它不与 libcgetenv(3)
/putenv(3)
保持同步,因此那些依赖于驱动程序或 NIF 中该行为的用户将需要添加手动同步。在 Windows 上,这意味着您不能再通过在加载驱动程序/NIF 之前修改
PATH
来解决 DLL 依赖项。为了减少这个问题,模拟器现在会将目标 DLL 的文件夹添加到 DLL 搜索路径。*潜在的不兼容性*
自有 ID:OTP-14666
修复了发送到原始隐藏节点 (erl_interface) 的连接刻度,当有效负载数据发送到隐藏节点但未收到时,可能会在极少数情况下导致错误的刻度超时。
自有 ID:OTP-14681
使组立即对来自 shell(例如 ssh)的 EXIT 信号做出反应。
自有 ID:OTP-14991 辅助 ID:PR1705
现在对关闭的套接字调用
gen_tcp:send/2
返回{error, closed}
而不是{error,enotconn}
。自有 ID:OTP-15001
included_applications
键不再作为应用程序环境变量重复。之前,包含的应用程序既可以使用application:get[_all]_env(...)
函数读取,也可以使用application:get[_all]_key(...)
函数读取。现在,只能使用application:get[_all]_key(...)
读取。*潜在的不兼容性*
自有 ID:OTP-15071
通过
file:write_file_info
、file:change_owner
和file:change_group
进行的所有者和组更改将不再在权限错误时报告成功。*潜在的不兼容性*
自有 ID:OTP-15118
改进和新特性
Erlang/OTP 中新增了一个日志记录 API,请参阅
logger
手册页和 Kernel 用户指南中的 日志记录 部分。对
error_logger
的调用会自动重定向到新的 API,并且仍然可以使用旧的错误日志记录事件处理程序。但是,建议在编写新代码时直接使用 Logger API。请注意以下潜在的不兼容性
内核配置参数
error_logger
仍然有效,但如果默认处理程序的输出目标配置了内核配置参数logger
,则会被覆盖。通常,用于配置错误日志记录器的参数会被用于配置 Logger 的新参数覆盖。
SASL 错误日志记录的概念已弃用,这意味着默认情况下,SASL 应用程序不会影响记录哪些日志事件。
默认情况下,supervisor 报告和崩溃报告由 Kernel 启动的默认 Logger 处理程序记录,并最终与来自 Erlang/OTP 的其他标准日志事件到达相同的目标(终端或文件)。
默认情况下不记录进度报告,但可以通过将主日志级别设置为 info 来启用,例如使用内核配置参数
logger_level
。要获得与早期版本中的 SASL 错误日志记录功能向后兼容的能力,请将内核配置参数
logger_sasl_compatible
设置为true
。这会阻止默认的 Logger 处理程序记录任何 supervisor 报告、崩溃报告或进度报告。相反,SASL 在应用程序启动期间添加一个单独的 Logger 处理程序,该处理程序负责这些日志事件。SASL 配置参数sasl_error_logger
和sasl_errlog_type
指定这些事件的日志记录目标(终端或文件)和严重级别。
由于 Logger 是 Erlang/OTP 21.0 中的新功能,我们保留在此版本之后的补丁中对 Logger API 和功能进行更改的权利。这些更改可能与初始版本向后兼容,也可能不兼容。
*潜在的不兼容性*
自有 ID:OTP-13295
函数
inet:i/0
已被记录。自有 ID:OTP-13713 辅助 ID:PR-1645
netns
和bind_to_device
选项的类型规范已添加到gen_tcp
、gen_udp
和gen_sctp
函数中。自有 ID:OTP-14359 辅助 ID:PR-1816
引入了用于实现 Erlang 分布的替代载体的新功能。这主要包括对使用分布控制器进程的支持(以前只能将端口用作分布控制器)。有关更多信息,请参阅 ERTS 用户指南 ➜ 如何为 Erlang 分布实现替代载体 ➜ 分布模块。
自有 ID:OTP-14459
seq_trace
标签现在可以是任何 erlang 项。自有 ID:OTP-14899
SSL 分布协议
-proto inet_tls
已停止设置 SSL 选项server_name_indication
。在inet_tls_dist
中添加了新的客户端和服务器验证函数,尚未记录,如果对等证书中存在节点名称,则会检查节点名称。用法也尚未记录。自有 ID:OTP-14969 辅助 ID:OTP-14465、ERL-598
将
gen_server
调用到auth
服务器的超时时间从默认的 5 秒更改为infinity
。自有 ID:OTP-15009 辅助 ID:ERL-601
传递给 erl 的
-epmd_module
的回调模块已扩展为能够执行名称和端口解析。文档也已添加到
erl_epmd
参考手册和 ERTS 用户指南 如何为 Erlang 分布实现替代节点发现 中。自有 ID:OTP-15086 辅助 ID:PR-1694
在 sys.config 中使用相对路径指定的包含配置文件现在首先相对于 sys.config 本身的目录进行搜索。如果找不到,也会相对于当前工作目录进行搜索。后者是为了向后兼容。
自有 ID:OTP-15137 辅助 ID:PR-1838
Kernel 5.4.3.2
修复的错误和故障
dist_util.erl 中非语义更改,以消除 dialyzer 警告。
自有 ID:OTP-15170
Kernel 5.4.3.1
修复的错误和故障
修复了在节点间分布连接上发送心跳的方式中一些潜在的错误行为。即使有未发送的缓冲数据,现在也会向 c 节点发送心跳,因为 c 节点需要心跳才能发送回复心跳。当由于未发送的缓冲数据而抑制心跳时,发送的数据量计算错误。
自有 ID:OTP-15162 辅助 ID:ERIERL-191
Kernel 5.4.3
修复的错误和故障
更正了一些合约。
自有 ID:OTP-14889
拒绝加载名称包含目录分隔符(Windows 上为 '/' 或 '\')的模块。
自有 ID:OTP-14933 辅助 ID:ERL-564、PR-1716
修复了 Windows 上 os:cmd/2 选项 max_size 的处理错误。
自有 ID:OTP-14940
Kernel 5.4.2
修复的错误和故障
Kernel 5.4.1
修复的错误和故障
重构了一个内部 API。
自有 ID:OTP-14784
Kernel 5.4
修复的错误和故障
切换作业 (Ctrl+G) 后进行输出的进程可能会永远卡在 I/O 请求中。
自有 ID:OTP-14571 辅助 ID:ERL-472
改进和新特性
现在可以在锁计数模拟器中运行时完全切换锁计数 (
-emu_type lcnt
)。默认情况下,一切都处于启用状态以匹配旧的行为,但是当禁用时,可以使用最小的运行时开销随意切换特定的类别。有关详细信息,请参阅lcnt:rt_mask/1
上的文档。自有 ID:OTP-13170
lcnt:collect
和lcnt:clear
将不再阻止运行时系统中的所有其他线程。自有 ID:OTP-14412
常规 Unicode 改进。
自有 ID:OTP-14462
Kernel 5.3.1
修复的错误和故障
disk_log:open/1 中 'quiet' 选项的文档具有不正确的默认值。
自有 ID:OTP-14498
Kernel 5.3
修复的错误和故障
已修复函数
inet:ntoa/1
,使其根据编写此函数后批准的 RFC 5935 返回小写字母。以前返回大写字母,因此这可能是一个向后不兼容的更改,具体取决于返回的地址字符串的使用方式。已修复函数
inet:parse_address/1
以接受作用域地址上的 % 后缀。这些地址尚不起作用,但不会产生解析错误。*潜在的不兼容性*
自有 ID:OTP-13006 辅助 ID:ERIERL-20、ERL-429
修复了在 Linux 上 gethostname 错误地因 enametoolong 而失败的错误。
自有 ID:OTP-14310
修复了当为模块启用
local
调用跟踪时,导致code:is_module_native
错误返回 true 的错误。自有 ID:OTP-14390
添加了对来自分布式节点的无效节点名称的早期拒绝。
自有 ID:OTP-14426
改进和新特性
由于现在允许在原子中使用 Unicode,因此需要对节点名称进行额外的检查,这些名称被限制为 Latin-1。
自有 ID:OTP-13805
替换了已弃用的符号
时间单位
表示法的使用。自有 ID:OTP-13831 辅助 ID:OTP-13735
file:write_file(Name, Data, [raw])
会在写入之前将Data
转换为单个二进制文件。这意味着如果给定二进制文件列表并告知使用raw
模式写入,则无法利用writev()
系统调用。自有 ID:OTP-13909
在某些极端情况下(大项),
disk_log
的性能得到了一定的提高,并且文档已得到澄清。自有 ID:OTP-14057 辅助 ID:PR-1245
已添加用于检测已更改代码的功能。
code:modified_modules/0
返回所有当前加载的、在磁盘上已更改的模块。code:module_status/1
返回模块的状态。在 shell 和c
模块中,mm/0
是code:modified_modules/0
的简写,而lm/0
重新加载所有当前加载的、在磁盘上已更改的模块。自有 ID:OTP-14059
在 Erlang 中引入一个事件管理器来处理操作系统信号。可以订阅操作系统信号的子集,这些信号在 Kernel 应用程序中描述。
自有 ID:OTP-14186
现在,在支持的平台上,套接字可以绑定到设备 (SO_BINDTODEVICE)。
例如,这已实现以支持 Linux 下的 VRF-Lite;请参阅 VRF 和 GitHub 拉取请求 #1326。
自有 ID:OTP-14357 辅助 ID:PR-1326
添加了将 shell_history 存储在磁盘上的选项,以便可以在会话之间重用历史记录。
自有 ID:OTP-14409 辅助 ID:PR-1420
由
gen_server
、gen_statem
和proc_lib
创建的崩溃报告的大小通过 Kernel 应用程序变量error_logger_format_depth
来限制。目的是限制当具有巨大消息队列或状态的进程崩溃时发送到error_logger
进程的消息的大小。由
proc_lib
生成的崩溃报告包括新的标签message_queue_len
。邻居报告也包括新的标签current_stacktrace
。最后,邻居报告不再包括标签messages
和dictionary
。可以使用新函数
error_logger:get_format_depth/0
来检索 Kernel 应用程序变量error_logger_format_depth
的值。自有 ID:OTP-14417
global
模块使用的其中一个 ETS 表格使用{read_concurrency, true}
创建,以减少争用。自有 ID:OTP-14419
已在相关文档中添加警告,说明不要在暴露的环境中使用不安全的分布式节点。
自有 ID:OTP-14425
Kernel 5.2
修复的错误和故障
修复了 os:cmd 清理期间的竞争,该竞争可能导致 os:cmd 无限期挂起。
自有 ID:OTP-14232 辅助 ID:seq13275
改进和新功能
在 '
file
' 模块中接受路径列表的函数(例如file:path_consult/2
)现在如果路径包含非目录的内容,将继续在路径中搜索。自有 ID:OTP-14191
已知接收大量消息的两个 OTP 进程是 'rex'(由 'rpc' 使用)和 'error_logger'。这些进程现在将未处理的消息存储在进程堆之外,这可能会降低垃圾回收的成本。
自有 ID:OTP-14192
Kernel 5.1.1
修复的错误和故障
code:add_pathsa/1
和命令行选项-pa
在代码路径的开头添加给定目录列表时都会反转该列表。现在已经记录在案。自有 ID:OTP-13920 辅助 ID:ERL-267
添加了对 erts-8.1 的丢失运行时依赖项。这应该在 kernel-5.1 (OTP-19.1) 中完成,因为它至少在 erts-8.1 (OTP-19.1) 的情况下才能运行。
自有 ID:OTP-14003
改进了 gen_{tcp,udp,sctp}:controlling_process/2 的类型和文档。
自有 ID:OTP-14022 辅助 ID:PR-1208
Kernel 5.1
修复的错误和故障
修复了调用 seq_trace:get_system_tracer() 时出现的内存泄漏。
自有 ID:OTP-13742
修复了当将应用程序的 ebin 目录添加到代码路径时,
code:priv_dir/1
函数返回相同应用程序的 priv 目录的错误路径的问题。自有 ID:OTP-13758 辅助 ID:ERL-195
修复了添加两层代码路径时代码服务器崩溃的问题。
自有 ID:OTP-13765 辅助 ID:ERL-194
在连接到 EPMD 时遵守 -proto_dist 开关
自有 ID:OTP-13770 辅助 ID:PR-1129
修复了一个错误,该错误会导致当具有无限关闭超时(例如,主管)的进程在终止时尝试加载代码时,init:stop 可能会死锁。
自有 ID:OTP-13802
关闭 os:cmd 中运行的命令的 stdin。这是一个向后兼容性修复,恢复了 19.0 之前 os:cmd 的行为。
自有 ID:OTP-13867 辅助 ID:seq13178
改进和新功能
添加
net_kernel:setopts/2
和net_kernel:getopts/2
以在运行时控制分发套接字的选项。自有 ID:OTP-13564
以 IPv6 套接字的
tclass
套接字选项的形式实现了对 DSCP 的基本支持。自有 ID:OTP-13582
Kernel 5.0.2
修复的错误和故障
当从将 trap_exit 设置为 true 的进程调用 os:cmd 时,'EXIT' 消息将保留在消息队列中。此错误是在 kernel vsn 5.0.1 中引入的。
自有 ID:OTP-13813
Kernel 5.0.1
修复的错误和故障
修复了一个 os:cmd 错误,其中使用 & 创建后台作业会导致 os:cmd 挂起,直到后台作业终止或关闭其 stdout 和 stderr 文件描述符。此错误从 kernel 5.0 开始就存在。
自有 ID:OTP-13741
Kernel 5.0
修复的错误和故障
改进了
on_load
函数的处理。主要的改进是,如果由于on_load
函数失败导致代码升级失败,则现在将保留该模块的先前版本。自有 ID:OTP-12593
rpc:call()
和rpc:block_call()
有时会引发异常(文档中未提及)。此问题已得到纠正,因此将改为返回{badrpc,Reason}
。自有 ID:OTP-13409
在 Windows 上,对于早期加载的模块(例如
lists
模块),code:which/1
将返回带有混合斜杠和反斜杠的路径,例如:"C:\\Program Files\\erl8.0/lib/stdlib-2.7/ebin/lists.beam"
。此问题已得到纠正。自有 ID:OTP-13410
使 file:datasync 在 Mac OSX 上使用 fsync 而不是 fdatasync。
自有 ID:OTP-13411
为了减少连接问题,在没有本机 sendfile 的平台上使用的备用 sendfile 实现的默认块大小已减小。
自有 ID:OTP-13444
在某些 Unix 平台(例如,OS X 和 FreeBSD)上,大文件写入(2Gb 或更多)可能会失败。
自有 ID:OTP-13461
修复了一个错误,其中 DNS 解析器 inet_res 在启动后没有立即刷新其对例如 resolv.conf 内容的视图,因此导致名称解析失败。由 Michal Ptaszek 在 GitHUB 拉取请求 #949 中报告并提出了修复建议。
自有 ID:OTP-13470 辅助 ID:Pull #969
修复了 global_group 中的进程泄漏。
自有 ID:OTP-13516 辅助 ID:PR-1008
函数
inet:gethostbyname/1
现在遵循解析器选项inet6
,而不是始终查找 IPv4 地址。*潜在的不兼容性*
自有 ID:OTP-13622 辅助 ID:PR-1065
现在会对
init:stop/1
的Status
参数进行健全性检查,以确保erlang:halt
不会失败。自有 ID:OTP-13631 辅助 ID:PR-911
改进和新功能
向 inet:setopts/2 和 decode_packet/3 添加 {line_delim, byte()} 选项
自有 ID:OTP-12837
添加了
os:perf_counter/1
。perf_counter 是一个非常非常廉价且高分辨率的定时器,可用于为系统事件添加时间戳。它没有单调性保证,但在大多数操作系统上都应该显示单调时间。
自有 ID:OTP-12908
在 unix 平台上优化了 os:cmd 调用,以便更好地随调度器数量进行缩放。
自有 ID:OTP-13089
已将可以一次加载多个模块的新函数添加到 '
code
' 模块。这些函数是code:atomic_load/1
、code:prepare_loading/1
、code:finish_loading/1
和code:ensure_modules_loaded/1
。自有 ID:OTP-13111
结果证明代码路径缓存功能在实践中不是很有用,因此已被删除。如果尝试启用代码路径缓存,将有一个警告报告通知用户该功能已被删除。
自有 ID:OTP-13191
当尝试使用与现有节点相同的名称启动分布式 Erlang 节点时,错误消息将比以前更短且更易于阅读。示例
协议 'inet_tcp':名称 somename@somehost 似乎已被另一个 Erlang 节点使用
自有 ID:OTP-13294
默认错误记录器的输出稍微漂亮且更易于阅读。默认错误记录器在 OTP 系统启动期间使用。如果启动失败,输出将更易于阅读。
自有 ID:OTP-13325
已删除 R12B 中已弃用的函数
rpc:safe_multi_server_call/2,3
。*潜在的不兼容性*
自有 ID:OTP-13449
更新 dist_util 中的错误原因,并在调用了 net_kernel:verbose(1) 的情况下在日志中显示它们。
自有 ID:OTP-13458
已实现对 Unix 域套接字的实验性支持。如果您想尝试一下,请阅读源代码。示例:
gen_udp:open(0, [{ifaddr,{local,"/tmp/socket"}}])
。在收到用户对实验性 API 的反馈后,将编写文档。自有 ID:OTP-13572 辅助 ID:PR-612
允许将 heart 配置为在调用 HEART_COMMAND 之前不杀死先前的仿真器。这是通过将环境变量 HEART_NO_KILL 设置为 TRUE 来完成的。
自有 ID:OTP-13650
Kernel 4.2
修复的错误和故障
code:load_abs([10100])
将导致整个运行时系统崩溃并创建崩溃转储。已更正为在调用进程中生成错误异常。还更正了代码加载函数的规范,并在文档中添加了有关代码加载函数返回的错误原因的更多信息。
自有 ID:OTP-9375
gen_tcp:accept/2
并非时间扭曲安全的。这是因为它在计算超时时使用了与erlang:now/0
返回的相同时间。现在这个问题已得到修复。自有 ID:OTP-13254 辅助 ID:OTP-11997,OTP-13222
修正了
inet:getifaddrs/1
的契约。自有 ID:OTP-13335 辅助 ID:ERL-95
改进和新特性
改进了时间扭曲安全性。
在跟踪、顺序跟踪和系统性能分析功能中引入了
monotonic_timestamp
和strict_monotonic_timestamp
选项。这是因为已有的timestamp
选项不是时间扭曲安全的。在
ets:info/2
和dets:info/2
中引入了safe_fixed_monotonic_time
选项。这是因为已有的safe_fixed
选项不是时间扭曲安全的。自有 ID:OTP-13222 辅助 ID:OTP-11997
为 heart 添加验证回调
erlang heart 进程现在可以安装验证回调。如果存在验证回调,则在任何心跳发送到 heart 端口程序之前执行该回调。如果验证失败或停滞,则不会发送心跳,并且节点将关闭。
使用选项
'check_schedulers'
,heart 在心跳发送到端口程序之前执行调度程序的响应性检查。如果响应性检查失败,则不会执行心跳(如预期)。自有 ID:OTP-13250
澄清了
net_kernel:allow/1
的文档自有 ID:OTP-13299
EPMD 同时支持 IPv4 和 IPv6
也影响了最早支持的 Windows 版本。
自有 ID:OTP-13364
Kernel 4.1.1
修复的 Bug 和故障
现在,根据 RFC 4343,通过 inet_res(Erlang DNS 解析器)进行的主机名查找是不区分大小写的。由 Holger Weiß 提交的补丁。
自有 ID:OTP-12836
IPv6 分发处理程序已更新为与 IPv4 共享代码,以便在 IPv6 中也支持所有功能。修复了使用 IPv4 地址作为主机名时出现的错误。
自有 ID:OTP-13040
根据 RFC 4343,内部 DNS 解析器 inet_res 中主机名的缓存已设置为不区分大小写。
自有 ID:OTP-13083
修复了 cooked 文件模式缓冲,因此在 Posix 系统上,file:position/2 现在按照 Posix 的规定工作,即当 file:position/2 返回错误时,文件指针不受影响。
但是,Windows 系统文档在这方面尚不明确,因此 file:position/2 的文档仍然不承诺任何内容。
已修正 cooked 文件模式 file:pread/2,3 和 file:pwrite/2,3 以遵循字符编码,就像 file:position/2 和 file:read/2 或 file:write/2 的组合一样。这可能不是很有用,因为调用者端的字符表示形式始终是 latin1。
自有 ID:OTP-13155 辅助 ID:PR#646
改进和新特性
向 inet:setopts/2 和 decode_packet/3 添加 {line_delim, byte()} 选项
自有 ID:OTP-12837
Kernel 4.1
改进和新特性
引入了一种机制,用于限制内置错误记录器事件将产生的文本量。它对于限制日志文件的大小和用于生成日志文件的 CPU 时间都很有用。
此机制是实验性的,这意味着如果事实证明它没有解决它应该解决的问题,则可能会进行更改。在这种情况下,此机制可能会有向后不兼容的改进。
有关如何启用此功能的信息,请参阅 Kernel 应用程序中配置参数
error_logger_format_depth
的文档。自有 ID:OTP-12864
Kernel 4.0
修复的 Bug 和故障
修复了
file:read_line/1
对 Unicode 内容的错误处理。自有 ID:OTP-12144
引入了
os:getenv/2
,它类似于os:getenv/1
,但如果所需的 环境变量未定义,则返回传递的默认值。自有 ID:OTP-12342
现在可以在 JCL 模式下(使用 Ctrl-Y)粘贴在之前的 shell 会话中复制的文本。还修复了粘贴文本时导致 JCL 模式崩溃的错误。
自有 ID:OTP-12673
确保从字符串解析 IPv6 地址时,每个段的最大位数为 4 个十六进制数字
自有 ID:OTP-12773
改进和新特性
新的 BIF:
erlang:get_keys/0
,列出与进程字典关联的所有键。注意:erlang:get_keys/0
是自动导入的。*潜在的不兼容性*
自有 ID:OTP-12151 辅助 ID:seq12521
内部 group 到 user_drv 协议已更改为同步,以保证发送到实现 user_drv 协议的进程的输出在回复之前被打印。此协议由 standard_output 设备和 ssh 应用程序在充当客户端时使用。
此更改将以前打印到 standard_io 和最终进入 user_drv 的其他设备时的无限缓冲区更改为 1KB。
*潜在的不兼容性*
自有 ID:OTP-12240
inflateInit/2
和deflateInit/6
函数现在接受等于 8 和 -8 的 WindowBits 参数。自有 ID:OTP-12564
默认情况下,将错误记录器警告映射到警告消息。
自有 ID:OTP-12755
默认情况下,将 beam 错误记录器警告映射到警告消息。以前,这些消息默认映射到错误通道。
自有 ID:OTP-12781
gen_tcp:shutdown/2 现在是异步的
这解决了旧实现中的以下问题
当 TCP 对等方空闲或速度较慢时,它不会阻塞。这是调用 shutdown() 时的预期行为:调用方需要能够继续从套接字读取,而不是被阻止这样做。
它不会截断输出。如果 TCP 对等方空闲或速度较慢,当前版本的 gen_tcp:shutdown/2 将在大约 10 秒后截断驱动程序队列中的任何出站数据。更糟糕的是,它甚至不会通知任何人数据已被截断:向调用方返回“ok”;并且向 TCP 对等方发送 FIN 而不是 RST。
*潜在的不兼容性*
自有 ID:OTP-12797
在许多情况下,用户代码需要能够区分正常关闭的套接字和中止的套接字。设置选项 {show_econnreset, true} 使用户能够在主动和被动套接字上接收 ECONNRESET 错误。
自有 ID:OTP-12843
Kernel 3.2.0.1
修复的 Bug 和故障
由于只使用了一个选项,因此无法在对任何 gen_tcp 函数的一次调用中多次使用“raw”套接字选项。此错误已得到修复,并且还修复了一个关于从 inet:setopts/2 中传播错误代码的小错误。
自有 ID:OTP-11482 辅助 ID:seq12872
Kernel 3.2
修复的 Bug 和故障
更正了导致主机名解析中无限循环的错误。要触发此错误,您必须从配置文件(例如 .inetrc)输入错误的搜索方法。
由 Emil Holmström 发现的错误
自有 ID:OTP-12133
standard_error 进程现在可以正确处理 getopts I/O 协议请求,并以与 standard_io 相同的方式存储其编码。
此外,io:put_chars(standard_error, [oops]) 之前可能会使 standard_error 进程崩溃。现在已更正此问题。
自有 ID:OTP-12424
改进和新特性
添加了 Kernel 应用程序的配置参数,允许为分发套接字设置套接字选项。请参阅应用程序 Kernel 文档;参数“inet_dist_listen_options”和“inet_dist_connect_options”。
自有 ID:OTP-12476 辅助 ID:OTP-12476
Kernel 3.1
修复的 Bug 和故障
确保在需要时安装 .hrl 文件
自有 ID:OTP-12197
从 kernel 应用程序中删除了未记录的应用程序环境变量“raw_files”。每次要在 file 模块中打开原始文件时,都会检查此变量(通过调用 application:get_env/2)。
自有 ID:OTP-12276
修复了在 gen_udp 中使用 netns 选项时出现的错误,该错误仅在它是最后一个选项时才起作用。
自有 ID:OTP-12314
改进和新特性
更新了有关 inet 缓冲区大小选项的文档。
自有 ID:OTP-12296
在 file_info 和 link_info 函数中引入了新选项“raw”。此选项允许调用方不通过文件服务器获取有关保证是本地文件的信息。
自有 ID:OTP-12325
内核 3.0.3
已修复的错误和故障
在 net_adm:names/1 中接受 inet:ip_address()
自有 ID:OTP-12154
内核 3.0.2
已修复的错误和故障
OTP-11850 修复了 filelib:wildcard/1 以使其能够处理损坏的符号链接。然而,此修复引入了问题,因为对于 filelib:ensure_dir/1、filelib:is_dir/1、filelib:file_size/1 等函数,不再跟踪符号链接。现在已对此进行纠正。
自有 ID:OTP-12054 辅助 ID:seq12660
内核 3.0.1
已修复的错误和故障
如果传递给 application_controller:change_application_data 的配置包含其他配置文件,则只会为已存在的(已加载的)应用程序展开。如果升级添加了一个新的应用程序,该应用程序在包含的配置文件中有配置数据,则新的应用程序不会获得正确的配置数据。
现在已更改为将为所有应用程序展开配置数据。
自有 ID:OTP-11864
允许重新加载预加载的模块,例如
erlang
,但这可能会导致奇怪和不希望发生的事情,例如调用apply/3
进入循环。预加载的模块现在默认是粘性的。(感谢 Loïc Hoguin 报告此错误。)code:add_path("/ending/in/slash/")
删除尾部的斜杠,将/ending/in/slash
添加到代码路径。然而,code:del_path("/ending/in/slash/")
将无法删除路径,因为它没有删除尾部的斜杠。此问题已修复。自有 ID:OTP-11913
修复 erts_debug:size/1 以处理 Map 大小
自有 ID:OTP-11923
已删除
file:file_info/1
的文档。该函数本身很久以前就被删除了。自有 ID:OTP-11982
内核 3.0
已修复的错误和故障
修复了终止应用程序中的死锁可能性
自有 ID:OTP-11171
修复了当套接字处于被动模式时,sendfile 会为远程关闭的套接字返回错误代码的错误。(感谢 Vincent Siliakus 报告此错误。)
自有 ID:OTP-11614
新的选项
persistent
已添加到application:set_env/4
和application:unset_env/3
。使用persistent
选项设置的环境键不会被加载时在应用程序资源文件中配置的环境键覆盖。这意味着持久值将在应用程序加载后以及应用程序重新加载时保持不变。(感谢 José Valim)自有 ID:OTP-11708
file:set_cwd/1 的规范已修改为也接受二进制文件作为参数。这在代码中一直允许,但它没有反映在规范中,因为二进制文件主要用于原始文件名。原始文件名是未根据 file:native_name_encoding() 编码的名称,这些名称在 file:set_cwd/1 中是不允许的。但是,为了避免不必要的 dialyzer 警告,规范现在更加宽容。原始文件名仍然会在运行时因“no_translation”的原因而失败。(感谢 José Valim)
自有 ID:OTP-11787
改进和新功能
heart:set_cmd/1 已更新,允许给定的 heart 命令中使用 Unicode 代码点 > 255
自有 ID:OTP-10843
Dialyzer 的
unmatched_return
警告已得到纠正。自有 ID:OTP-10908
使 erlang:open_port/2 spawn 和 spawn_executable 处理 Unicode。
自有 ID:OTP-11105
Erlang/OTP 已移植到实时操作系统 OSE。该端口支持 smp 和非 smp 仿真器。有关该端口以及如何启动的详细信息,请参阅 ose 应用程序中的用户指南。
请注意,并非 Erlang/OTP 的所有部分都已移植。
有效的主要功能包括:非 smp 和 smp 仿真器、OSE 信号交互、crypto、asn1、run_erl/to_erl、tcp、epmd、分布以及 Erlang 的大多数(如果不是全部)非操作系统特定功能。
无效的主要功能包括:udp/sctp、os_mon、erl_interface、调度程序绑定。
自有 ID:OTP-11334
为 TCP、UDP 和 SCTP 添加 {active,N} 套接字选项,其中 N 是范围在 -32768..32767 之间的整数,允许调用者指定要传递给控制进程的数据消息数。一旦套接字的已传递消息计数达到 0 或通过 inet:setopts/2 显式设置为 0,或者在创建套接字时将 {active,0} 作为选项包含在内,则套接字将转换为被动 ({active, false}) 模式,并且套接字的控制进程会收到一条消息以通知其转换。TCP 套接字接收 {tcp_passive,Socket},UDP 套接字接收 {udp_passive,Socket},SCTP 套接字接收 {sctp_passive,Socket}。
套接字的已传递消息计数器默认为 0,但可以通过任何将套接字选项作为参数的 gen_tcp、gen_udp 或 gen_sctp 函数,或通过 inet:setopts/2 使用 {active,N} 来设置。新的 N 值会添加到套接字的当前计数器值中,并且可以使用负数来减少计数器值。指定一个会导致套接字的计数器值超过 32767 的数字会导致 einval 错误。如果指定的负数会导致计数器值变为负数,则套接字的计数器值将设置为 0,并且套接字将转换为被动模式。如果计数器值已为 0,并且指定了 inet:setopts(Socket, [{active,0}]),则计数器值仍为 0,但会为套接字生成相应的被动模式转换消息。
感谢 Steve Vinoski
自有 ID:OTP-11368
调用
garbage_collect/1
BIF 或check_process_code/2
BIF 可能会触发对调用 BIF 的进程以外的其他进程的垃圾回收。之前的实现执行这些类型的垃圾回收时没有考虑正在垃圾回收的进程的内部状态。为了能够更轻松、更高效地实现产生本机代码,这些类型的垃圾回收已被重写。这样的垃圾回收现在由异步请求信号触发,实际的垃圾回收由正在垃圾回收的进程本身执行,并通过向发出请求的进程发送回复信号来完成。使用这种方法,进程可以禁用垃圾回收并产生,而无需将堆设置为可以进行垃圾回收的状态。引入了
garbage_collect/2
和check_process_code/3
BIF。两者都将选项列表作为最后一个参数。使用这些选项,可以发出异步请求。code:purge/1
和code:soft_purge/1
已重写,以利用异步check_process_code
请求来并行化工作。特性影响:调用
garbage_collect/1
BIF 或check_process_code/2
BIF 通常需要更长的时间才能完成,而系统整体上不会像以前那样受到操作的负面影响。调用code:purge/1
和code:soft_purge/1
可能会更快或更慢地完成,具体取决于系统的状态,而系统整体上不会像以前那样受到操作的负面影响。自有 ID:OTP-11388 辅助 ID:OTP-11535, OTP-11648
向 file:open/2 添加 sync 选项。
sync 选项将 POSIX O_SYNC 标志添加到支持该标志或其等效标志的平台上的 open 系统调用中,例如 Windows 上的 FILE_FLAG_WRITE_THROUGH。对于不支持该标志的平台,如果传入 sync 选项,则 file:open/2 将返回 {error, enotsup}。感谢 Steve Vinoski 和 Joseph Blomstedt
自有 ID:OTP-11498
已纠正
inet:ntoa/1
的约定。感谢 Max Treskin。
自有 ID:OTP-11730
内核 2.16.4.1
已知错误和问题
当使用 gen_tcp:connect 和带有
port
和/或ip
的fd
选项时,将忽略port
和ip
选项。这已修复,以便如果port
和/或ip
与fd
一起指定,则会为该fd
请求绑定。如果未指定port
和/或ip
,则不会调用绑定。自有 ID:OTP-12061
内核 2.16.4
已修复的错误和故障
修复 inet:ifget/2 和 inet:ifget/3 返回值的类型规范。感谢 Ali Sabil。
自有 ID:OTP-11377
修复 erts、kernel 和 ssh 中的各种拼写错误。感谢 Martin Hässler。
自有 ID:OTP-11414
修复 rpc 多次调用示例代码。感谢 Edwin Fine。
自有 ID:OTP-11471
在极少数情况下,调用
inet:close/1
、gen_tcp:close/1
、gen_udp:close/1
或gen_sctp:close/1
的进程可能会无限期地挂起。自有 ID:OTP-11491
改进和新特性
根据 RFC 4960 的描述,添加更多 SCTP 错误。感谢 Artem Teslenko。
内部编号:OTP-11379
添加新的 BIF os:unsetenv/1,用于删除环境变量。感谢 Martin Hässler。
内部编号:OTP-11446
Kernel 2.16.3
修复的 Bug 和故障
修复 Erlang shell 中用户切换命令帮助的缩进问题。感谢 Sylvain Benner。
内部编号:OTP-11209
改进和新特性
之前未记录的函数 ntoa/1 已添加到 inet 文档中,并在 inet 模块中导出。
内部编号:OTP-10676 辅助编号:OTP-10314
修复 abcast() 函数注释中的拼写错误。感谢 Johannes Weissl。
内部编号:OTP-11219
添加 application:ensure_all_started/1-2。感谢 Fred Hebert。
内部编号:OTP-11250
使 edlin 理解一些重要的控制键。感谢 Stefan Zegenhagen。
内部编号:OTP-11251
清理 hipe_unified_loader,消除规范中使用 is_subtype/2 的情况,将模块本地 void 函数更改为返回 'ok' 而不是 [],并确保使用 --Wunmatched_returns 时没有 dialyzer 警告。感谢 Kostis Sagonas。
内部编号:OTP-11301
Kernel 2.16.2
修复的 Bug 和故障
修复了 prim_inet 中的一个错误。如果在关闭套接字端口时,端口所有者在不恰当的时间被杀死,端口可能会变成孤立状态,从而导致端口和套接字泄漏。由 Fred Herbert、Dmitry Belyaev 和其他人报告。
内部编号:OTP-10497 辅助编号:OTP-10562
修复了一些在使用内部查找类型(例如“file”和“dns”)时,主机名解析中关于大小写敏感性的错误。根据 RFC 4343 “域名系统 (DNS) 大小写不敏感性澄清”,查找主机名时,ASCII 字母 a-z 应被视为与 A-Z 相同,而以前并非总是如此。
内部编号:OTP-10689 辅助编号:seq12227
改进和新特性
添加
application:ensure_started/1,2
。它等效于application:start/1,2
,只是对于已经启动的应用程序,它返回ok
。内部编号:OTP-10910
优化与文件 IO 服务器的通信。感谢 Anthony Ramine。
内部编号:OTP-11040
包含非 ASCII 字符的 Erlang 源文件现在使用 UTF-8 编码(而不是 latin1)。
内部编号:OTP-11041 辅助编号:OTP-10907
通过使用无锁实现,优化在同一套接字上同时进行的
inet_db
操作。对系统特性的影响:性能得到提升。
内部编号:OTP-11074
在 OTP-R16A 中引入的
high_msgq_watermark
和low_msgq_watermark
inet
套接字选项只能在 TCP 套接字上设置。这些选项现在是通用的,可以在所有类型的套接字上设置。内部编号:OTP-11075 辅助编号:OTP-10336
修复 Windows 下 os:cmd/1 中深度列表参数错误。感谢 Aleksandr Vinokurov。
内部编号:OTP-11104
Kernel 2.16.1
修复的 Bug 和故障
修复了
application_controller
模块中可能导致崩溃并出现错误原因的错误。内部编号:OTP-10754
修复了
code:is_module_native/1
,在 R16A 中,有时对于包含 BIF(如lists
)的 hipe 编译模块会返回 false。内部编号:OTP-10870
当接收失败(例如,由于格式错误的包)时,在非被动模式下,尊重 tcp 套接字上的
{exit_on_close,false}
选项,仅执行半关闭,仍然允许在该套接字上发送。(感谢 Anthony Molinaro 和 Steve Vinoski 报告此问题)内部编号:OTP-10879
改进和新特性
当由于名称重复导致节点启动失败时,显示稍微友好的错误消息。感谢 Magnus Henoch。
内部编号:OTP-10797
由于 Unicode 支持进行的各种更新。
内部编号:OTP-10820
添加了一个新函数 code:get_mode(),可用于检测代码服务器的行为方式。感谢 Vlad Dumitrescu
内部编号:OTP-10823
修复 gen_tcp:send/2 中错误原因的类型。感谢 Sean Cribbs。
内部编号:OTP-10839
添加了可以处理原始文件名的
file:list_dir_all/1
和file:read_link_all/1
。有关原始文件名的信息,请参阅 STDLIB 用户指南。内部编号:OTP-10852
Kernel 2.16
修复的 Bug 和故障
在 .app 文件中,'modules' 列表中不再可能包含
{Mod,Vsn}
。虽然从未在 .app 文件参考手册中记录过,但早期是允许的。但它在
application:load/[1,2]
的文档中可见,其中与 .app 文件中相同的术语可以用作第一个参数。该可能性已被删除,因为
Vsn
部分从未使用过。*潜在的不兼容性*
内部编号:OTP-10417
更正了
erl_ddll:format_error/1
的约定。(感谢 Joseph Wayne Norton。)内部编号:OTP-10473
更改启动时应用程序崩溃消息的打印输出为格式化字符串 (感谢 Serge Aleynikov)
内部编号:OTP-10620
更正了
base64
模块中的类型ascii_string()
。清理了类型file:file_info()
。在文档中,类型file:fd()
已被设为不透明。内部编号:OTP-10624 辅助编号:kunagi-352 [263]
改进和新特性
Inet 导出的功能
inet:parse_ipv4_address/1, inet:parse_ipv4strict_address/1, inet:parse_ipv6_address/1, inet:parse_ipv6strict_address/1, inet:parse_address/1 和 inet:parse_strict_address 现在从 inet 模块导出。
内部编号:OTP-8067 辅助编号:kunagi-274 [185]
添加了用于 IPv6 套接字的布尔套接字选项“ipv6_v6only”。该选项的默认值取决于操作系统,因此旨在实现可移植性的应用程序在创建
inet6
监听/目标套接字时应考虑使用{ipv6_v6only,true}
,如有必要,还应在同一端口上创建一个inet
套接字以处理 IPv4 流量。请参阅文档。内部编号:OTP-8928 辅助编号:kunagi-193 [104]
实现了对 Unicode 的支持。
内部编号:OTP-10302
更新了
global:register_name/3
的文档,以提及将{Module,Function}
作为方法参数(解析函数)的使用已弃用。内部编号:OTP-10419
修复了在 Oracle Solaris 上执行 sendfile 时,如果完成部分发送将返回错误的 bug。
内部编号:OTP-10549
如果尝试调用现有模块中不存在的函数,则
error_handler
模块现在将调用'$handle_undefined_function'/2
。有关详细信息,请参阅error_handler
模块的文档。内部编号:OTP-10617 辅助编号:kunagi-340 [251]
在必要的情况下,Erlang 文件中添加了声明编码的注释。该注释旨在在 Erlang/OTP R17B 中删除,届时 UTF-8 将成为默认编码。
内部编号:OTP-10630
不要不必要地返回错误的术语。(感谢 Kostis Sagonas。)
内部编号:OTP-10662
更正了一些溢出 PDF 页面宽度的示例。
内部编号:OTP-10665
添加 file:allocate/3 操作
此操作允许预先分配文件的空间。仅在支持此类操作的系统上才能成功。(感谢 Filipe David Manana)
内部编号:OTP-10680
添加 application:get_key/3。新函数为配置参数提供默认值。感谢 Serge Aleynikov。
内部编号:OTP-10694
向 Erlang shell 的历史记录添加搜索功能。感谢 Fred Herbert。
内部编号:OTP-10739
Kernel 2.15.3
修复的 Bug 和故障
确保在需要时生成“erl_crash.dump”。这将更改 erl_crash.dump 的行为。
* 如果未设置 ERL_CRASH_DUMP_SECONDS,则现在在崩溃时会立即终止 beam,而不会写入崩溃转储文件。
* 将 ERL_CRASH_DUMP_SECONDS 设置为 0 也会在崩溃时立即终止 beam,而不会写入崩溃转储文件,即与未设置 ERL_CRASH_DUMP_SECONDS 环境变量相同。
* 将 ERL_CRASH_DUMP_SECONDS 设置为负值将使 beam 无限期地等待写入崩溃转储文件。
* 将 ERL_CRASH_DUMP_SECONDS 设置为正值将使 beam 等待指定的秒数写入崩溃转储文件。
如果 heart 正在运行,则正值会在 beam 和 heart 中设置一个警报/超时以重新启动。
*潜在的不兼容性*
内部编号:OTP-10422 辅助编号:kunagi-250 [161]
Kernel 2.15.2
修复的 Bug 和故障
修复了当使用 controlling_process/2 且第二个参数为 self() 时,如果 self() 崩溃会导致端口泄漏的问题。(感谢 Ricardo Catalinas Jiménez)
内部 ID: OTP-10094
修复了使用 file:sendfile 回退时发送大文件会导致 file:sendfile 崩溃的问题。
内部 ID: OTP-10098
修复了 rpc:call/5 对于有限超时时间的本地调用的问题。(感谢 Tomer Chachamu)
内部 ID: OTP-10149
修复了 escript/主归档重新加载的问题
如果 escript/主归档文件添加到代码路径后其 mtime 发生更改,则正确重新加载归档并更新缓存。(感谢 Tuncer Ayaz)
内部 ID: OTP-10151
在以 Unicode 文件模式运行的系统上(例如,在 MacOSX 或 Linux 上,使用启动参数 +fnu 或 +fna 以及正确的 LOCALE)支持使用非 ASCII 字符(代码点大于 127)命名的主目录。此外,在适用的环境中,也支持包含 Unicode 内容的环境变量。
内部 ID: OTP-10160
允许混合 IPv4 和 IPv6 地址用于 sctp_bindx
还允许混合地址族进行绑定,因为多宿主 sctp 套接字上的第一个地址必须使用 bind 进行绑定,而其余地址则使用 sctp_bindx 进行绑定。至少 Linux 支持添加混合族的地址。即使在未定义 HAVE_SCTP 的情况下,也使 inet_set_faddress 函数可用,因为我们使用它来查找用于绑定的地址,以便能够混合 ipv4 和 ipv6 地址。感谢 Tomas Abrahamsson
内部 ID: OTP-10217
改进和新特性
记录 inet 选项:high_watermark、priority、linger 以及一些以前未记录的其他选项。
内部 ID: OTP-10053
从 inet 中删除 bit8 选项支持
内部 ID: OTP-10056
修正了磁盘日志头的类型。(感谢 Niclas Eklund)
内部 ID: OTP-10131
内核 2.15.1
修复的错误和故障
修正了驱动程序的输出,现在输出大型二进制文件(> 4 GiB)不会静默失败或使模拟器崩溃,而是输出二进制文件或使调用失败。这意味着现在可以将大于 4 Gib 的二进制文件写入文件,但在例如 64 位 Windows 上(其具有 32 位的分散/聚集 I/O 缓冲区段长度)会失败。将来可能会更改行为以始终写入二进制文件,必要时分部分写入。
内部 ID: OTP-9820 辅助 ID: OTP-9795
erts:对不必要的条件进行小的修复 erts:将 SENDFILE_CHUNK_SIZE 从有符号更改为无符号(感谢 jovi zhang)
内部 ID: OTP-9872
更正了
gen_sctp
中的两个合约。内部 ID: OTP-9874
如果进程调用具有正在运行的 on_load 处理程序的模块,则该进程应该被挂起。但是,如果带有 on_load 处理程序的模块正在加载时使用
code:load_binary/3
,则该调用将失败并抛出undef
异常。内部 ID: OTP-9875
如果 cookie 创建失败,现在将返回文件名和错误原因。(感谢 Magnus Henoch)
内部 ID: OTP-9954
修复了当将无效数据传递给
compress,uncompress,zip,unzip,gzip,gunzip
时zlib
中的端口泄漏问题。内部 ID: OTP-9981
更正了 global、error_logger、etop、lists、ets 和 supervisor 模块以及 c_portdriver 和 kernel_app 文档中各种拼写错误。(感谢 Ricardo Catalinas Jiménez)
内部 ID: OTP-9987
修复了当端口耗尽时 gen_tcp:accept/1,2 返回的错误。
对于这种情况,{error, enfile} 返回值具有很强的误导性并且令人困惑,因为 Posix ENFILE 错误号具有明确的含义,与 Erlang 端口无关。该修复将返回值更改为 {error, system_limit},这与例如各种 file(3) 函数一致。inet:format_error/1 也已更新为以与 file:format_error/1 相同的方式支持 system_limit。(感谢 Per Hedeland)
内部 ID: OTP-9990
已更正
erts_debug:size/1
以考虑 funs 环境中的共享。对于 funs,它过去总是给出与erts_debug:flat_size/1
相同的结果。内部 ID: OTP-9991
在某些情况下,当执行 file:sendfile 的进程在发送文件时崩溃时,efile_drv 代码不会正确清理自身。现在已经修复了这个问题。
内部 ID: OTP-9993
在基于 BSD 的平台上,当发送大文件时,file:sendfile 有时会进入无限循环。现在已经修复了这个问题。
内部 ID: OTP-9994
尽管
disk_log
为了更好的性能而积极地收集记录的术语,但收集过多数据可能会阻塞系统并导致写入巨大的二进制文件。问题已在 OTP-9764 中解决,但并非在所有情况下都得到了改进。
(感谢 Richard Carlsson。)
内部 ID: OTP-9999 辅助 ID: OTP-9764
.app 文件的文档错误地指出
mod
参数的默认值为undefined
。现在已更正为[]
。内部 ID: OTP-10002
内核 2.15
修复的错误和故障
已将对
global:whereis_name/1
的调用替换为对global:safe_whereis_name/1
的调用,因为后者根本不安全。之前不这样做的原因是设置全局锁掩盖了与受监控子项的重新启动有关的错误。现在已通过修改
global:whereis_name/1
修复了该错误。(感谢 Ulf Wiger 的代码贡献。)修复了
gen_fsm:start*
中的一个小竞争条件:如果这些函数之一返回{error, Reason}
或 ignore,则该名称仍然可以注册(本地或在global
中)。(这与在 OTP-7669 中为 gen_server 所做的修改相同。)已删除未记录的函数
global:safe_whereis_name/1
。内部 ID: OTP-9212 辅助 ID: seq7117, OTP-4174
通过 TCP 套接字和
erlang:decode_packet
,对 http 数据包解析采用packet_size
选项。这使您可以接受大于默认设置的 HTTP 标头,还可以通过仅接受您希望允许的长度的行来避免 DoS 攻击。为了保持一致性,数据包类型line
也采用packet_size
选项。(感谢 Steve Vinoski)内部 ID: OTP-9389
disk_log:reopen/2,3
和disk_log:breopen/3
可能会从file:rename/2
返回错误原因,而不是{file_error, Filename, Reason}
。此错误已修复。根据文档,当截断或重新打开磁盘日志失败时,将发送的消息
{disk_log, Node, {error, disk_log_stopped}}
有时会变成回复。此错误已修复。*潜在的不兼容性*
内部 ID: OTP-9508
将环境变量“shutdown_timeout”添加到内核应用程序。以前,如果应用程序的顶级监督者在关闭请求时未终止,则 application_controller 将永远挂起。如果将此新环境变量设置为正整数 T,则应用程序控制器现在将在 T 毫秒后放弃,并改为强制终止应用程序。为了向后兼容,shutdown_timeout 的默认值为“infinity”。
内部 ID: OTP-9540
在 stdlib 的行为中添加“-callback”属性
将 stdlib 行为中的 behaviour_info(callbacks) 导出替换为所有回调的 '-callback' 属性。使用有关回调属性的信息更新文档 从 '-callback' 属性自动生成 'behaviour_info' 函数
'behaviour_info(callbacks)' 是在描述行为的模块中定义的特殊函数,并返回其回调的列表。
现在使用 '-callback' 规范自动生成此函数。如果用户同时定义了 '-callback' 属性和 behaviour_info/1 函数,则 lint 将返回错误。如果回调不需要类型信息,请为其使用通用规范。将 '-callback' 属性添加到语言语法
行为可以使用熟悉的 spec 语法为回调定义规范,并将 '-spec' 关键字替换为 '-callback'。执行简单的 lint 检查以确保没有重复定义回调,并且所有引用的类型都已声明。
然后,工具可以使用这些属性为行为提供文档或查找回调模块中回调定义中的差异。
将回调规范添加到内核中的“application”模块中 根据 Internet 文档将回调规范添加到 tftp 模块 根据可能已弃用的注释将回调规范添加到 inets_service 模块
内部 ID: OTP-9621
使 Tab 补全在远程 shell 中工作(感谢 Mats Cronqvist)
内部 ID: OTP-9673
在 heart 文档中添加缺少的括号。
在参考手册的分布式部分中添加缺少的空格。
在文档的 HTML 版本中,这些空格是分隔这些单词所必需的。
内部 ID: OTP-9693
修复 net_kernel:get_net_ticktime() 文档
添加返回“ignored”时缺少的描述。(感谢 Ricardo Catalinas Jiménez)
内部 ID: OTP-9713
尽管
disk_log
为了更好的性能而积极地收集记录的术语,但收集过多数据可能会阻塞系统并导致写入巨大的二进制文件。为了纠正这种情况,引入了在写入磁盘之前收集的数据量(小)限制。内部 ID: OTP-9764
- 更正应用程序模块中的回调规范
- 改进有关具有额外范围的回调规范的警告
- 清理 autoimport 编译器指令
- 修复 typer 中 Dialyzer 的警告
- 修复 Dialyzer 自身代码的警告
- 修复 Dialyzer 行为分析中的错误
- 修复 Dialyzer 中的崩溃
- 变量替换没有泛化任何未知变量。
内部 ID: OTP-9776
修复使用无效日期调用 file:change_time/2,3 时发生的崩溃
使用无效日期元组调用 file:change_time/2,3(例如 file:change_time("file.txt", {undefined, undefined})) 将导致 file_server_2 崩溃。error_logger 将关闭,并且整个虚拟机将停止。更改行为以验证系统边界上给定的日期。(即在发出服务器调用之前)。(感谢 Ahmed Omar)
内部 ID: OTP-9785
改进和新特性
现在可以向
file:read_file_info/2, file:read_link_info/2
和file:write_file_info/3
传递一个选项列表参数,并在调用中设置时间类型信息。有效的选项是{time, local}, {time, universal}
和{time, posix}
。在使用posix
时间的情况下,不会进行转换,这使得操作速度更快一些。内部ID:OTP-7687
file:list_dir/1,2
现在会先用 efile 驱动程序中的文件名填充整个缓冲区,然后再将其发送到 Erlang 进程。这将会在大多数情况下加速此文件操作。内部ID:OTP-9023
如果不支持 SCTP,
gen_sctp:open/0-2
现在可能会返回 {error,eprotonosupport}gen_sctp:peeloff/1
已经实现,并创建了一个一对一的套接字,现在也支持这种套接字。*潜在的不兼容性*
内部ID:OTP-9239
Sendfile 已添加到文件模块的 API 中。
sendfile/2
用于从文件中读取数据,并使用零拷贝机制将其发送到 TCP 套接字(如果操作系统支持)。感谢 Tuncer Ayaz 和 Steve Vinovski 的原始实现
内部ID:OTP-9240
元组函数(包含模块名和函数的双元素元组)现在已被正式弃用,并将在 R16 中删除。请改用 '
fun M:F/A
'。为了让您了解您的系统正在使用元组函数,第一次应用元组函数时,将会向错误日志发送警告。内部ID:OTP-9649
Kernel 2.14.5
修复的 Bug 和故障
修复 gen_tcp:send/2 和 gen_udp:send/4 的 Packet 参数类型
该类型被标记为 binary() 或 string(),但实际上它可以是 iodata()。测试套件已更新,以确认 gen_tcp/2 和 gen_udp:send/4 函数接受 iodata() (iolist) 数据包。(感谢 Filipe David Manana)
内部ID:OTP-9514
XML 文件已更正。
内部ID:OTP-9550 辅助ID:OTP-9541
改进和新特性
inet 模块的类型和规范已得到改进。
内部ID:OTP-9260
已添加类型和规范。
内部ID:OTP-9356
STDLIB 和 Kernel 中的合约已得到改进,并且类型错误已得到纠正。
内部ID:OTP-9485
更新了一些 zlib 函数的文档和规范。
内部ID:OTP-9506
Kernel 2.14.4
修复的 Bug 和故障
gen_tcp 中的 send_timeout 选项在主动模式或使用 {active,once} 选项时无法正常工作。现在已更正。
内部ID:OTP-9145
修复了文档中的各种拼写错误(感谢 Tuncer Ayaz)
内部ID:OTP-9154
修复了 rpc:pmap/3 的文档中的拼写错误(感谢 Ricardo Catalinas Jiménez)
内部ID:OTP-9168
更正了专用 DNS 解析器 inet_res 中的一个 bug。具有不幸时机的延迟答案可能导致运行时异常。还进行了一些代码清理和改进。感谢 Evegeniy Khramtsov 提供精确的错误报告和错误修复测试。
内部ID:OTP-9221 辅助ID:OTP-8712
改进和新特性
已添加类型和规范。
内部ID:OTP-9268
Erlang 类型和规范用于文档。
内部ID:OTP-9272
修改了两个在运行 Dialyzer 时可能导致警告的不透明类型。
内部ID:OTP-9337
Kernel 2.14.3
修复的 Bug 和故障
os:find_executable/{1,2}
将不再返回恰好位于 PATH 中的目录的路径。内部ID:OTP-8983 辅助ID:seq11749
修复 file:write_file/3 的 -spec
将第二个参数的类型从 binary() 更改为 iodata(),因为该函数明确采取步骤来接受列表和二进制文件。(感谢 Magnus Henoch)。
内部ID:OTP-9067
清理代码模块的规范
在将 unicode_binary() 添加到 file:filename() 类型后,dialyzer 开始抱怨“代码”模块中某些函数中存在错误或不完整的规范。罪魁祸首是 erl_bif_types 中此模块的函数的硬编码信息,这些信息没有更新。由于这些函数现在具有适当的规范,并且代码重复(双关语)绝不是一个好主意,因此它们类型信息已从 erl_bif_types 中删除。
在执行此操作时,修复了代码模块中的一些错误注释,并确保代码现在即使使用 -Wunmatched_returns 选项也能在没有 dialyzer 警告的情况下运行。
还对 erl_bif_types 应用了一些清理。
内部ID:OTP-9100
- 为不返回的函数添加 spec - 加强 spec - 引入类型以避免 specs 中的重复 - 为不返回的函数添加 specs - 为行为回调添加 specs - 简化两个 specs
内部ID:OTP-9127
Kernel 2.14.2
改进和新特性
Erlang VM 现在支持 Unicode 文件名。在强制使用 Unicode 文件名的系统(Windows 和 MacOSX)上,此功能默认启用,但可以使用 '+fnu' 模拟器选项在其他系统上启用。但是,在默认情况下不使用 Unicode 文件名的系统上启用此功能被认为是实验性的,不能用于生产。随着 Unicode 文件名支持的引入,引入了“原始文件名”的概念,这意味着提供的文件名没有隐式的 Unicode 编码转换。原始文件名以二进制形式提供,而不是列表形式。有关更多信息,请参阅 stdlib 用户指南和有关在 Erlang 中使用 Unicode 的章节。另请参阅文件模块手册页。
*潜在的不兼容性*
内部ID:OTP-8887
现在有一个新的函数
inet:getifaddrs/0
,它仿照 BSD 和 Linux 上的 C 库函数 getifaddrs(),报告主机上存在的接口及其地址。这将替换未记录且不受支持的inet:getiflist/0
和inet:ifget/2
。内部ID:OTP-8926
Kernel 2.14.1.1
修复的 Bug 和故障
在嵌入式模式下,调用
code:priv_dir/1
或code
中的其他函数的 on_load 处理程序会导致系统挂起。由于crypto
应用程序现在包含一个调用code:priv_dir/1
的 on_loader 处理程序,因此在启动文件中包含crypto
应用程序将阻止系统启动。还扩展了
-init_debug
选项,以打印有关正在运行的 on_load 处理程序的信息,以便于调试。内部ID:OTP-8902 辅助ID:seq11703
Kernel 2.14.1
修复的 Bug 和故障
修复:inet:setopts(S, [{linger,{true,2}}]) 对于 SCTP 套接字返回 {error,einval}。inet_drv 在检查选项大小时存在一个 bug。
内部ID:OTP-8726 辅助ID:seq11617
对于启用 SCTP 的构建,gen_udp:connect/3 已损坏。它没有按预期检测到远程端错误。
内部ID:OTP-8729
在文档中,reference() 已替换为 ref()。
内部ID:OTP-8733
修复了 kernel-2.13.5.3 中引入的 bug。如果在
TransitionPerod
内两次运行net_kernel:set_net_ticktime/1
,则第二次调用将导致 net_kernel 进程崩溃,并出现badmatch
。内部ID:OTP-8787 辅助ID:seq11657, OTP-8643
inet:getsockopt for SCTP sctp_default_send_param 存在未初始化所需字段的 bug,导致随机答案。现在已更正。
内部ID:OTP-8795 辅助ID:seq11655
对于 HTTP 数据包模式下的套接字,如果标头中存在错误,则
gen_tcp:recv/2,3
的返回值将是{ok,{http_error,String}}
,而不是{error,{http_error,String}}
,以便与ssl:recv/2,3
一致。*潜在的不兼容性*
内部ID:OTP-8831
改进和新特性
即使使用 --enable-native-libs 配置 Erlang,非常早加载的模块(例如列表)的本机代码也不会被加载。这已得到更正。(感谢 Paul Guyot。)
内部ID:OTP-8750
未记录的函数 inet:ifget/2 已得到改进,可以在支持 getaddrinfo() 的平台(例如 BSD Unix)上返回接口硬件地址 (MAC)。请注意,它仍然不适用于所有平台,例如 Windows 或 Solaris,因此该函数仍然未记录。
还修复了 inet:ifget/2 和 inet:getservbyname/2 的缓冲区溢出和字段初始化 bug。
感谢 Michael Santos。
内部ID:OTP-8816
为了提高可用性,如果地址参数或“ip”选项包含 IPv6 地址(8 元组),则函数
gen_tcp:listen/2
,gen_tcp:connect/3-4
,gen_udp:open/2
和gen_sctp:open/1-2
的“inet6”选项现在是隐式的。内部ID:OTP-8822
Kernel 2.14
已修复的 Bug 和故障
os:find_executable 现在可以在 Windows 上使用可执行文件的完整名称作为输入,并且仍然可以找到它。例如,os:find_executable("werl.exe") 将像 os:find_executable("werl") 一样工作。
内部 ID:OTP-3626
Shell 的行编辑已得到改进,更类似于 readline 和其他 shell 的行为。(感谢 Dave Peticolas)
内部 ID:OTP-8635
在某些情况下,网络内核可能会挂起。(感谢 Scott Lystig Fritchie。)
内部 ID:OTP-8643 辅助 ID:seq11584
如果无法解析 DNS 回复,或者解析器导致 noconnection 类型错误,则内核 DNS 解析器会泄漏一个或两个端口。该 Bug 现已修复。还修复了一个触发端口泄漏 Bug 的 DNS 规范边界截断回复。
内部 ID:OTP-8652
改进和新功能
从这个版本开始,全局名称服务器不再支持运行 Erlang/OTP R11B 的节点。
内部 ID:OTP-8527
file 模块的函数 write、read 和 read_line 现在可以正确处理像 'standard_io' 和 'standard_error' 这样的命名 io_servers。
内部 ID:OTP-8611
已添加函数 file:advise/4 和 file:datasync/1。(感谢 Filipe David Manana。)
内部 ID:OTP-8637
在节点之间交换组时,
pg2
没有删除重复的成员。此 Bug 是在 R13B03 (kernel-2.13.4) 中引入的。内部 ID:OTP-8653
file:open/2 有一个新的选项 'exclusive',它在支持的地方使用操作系统 O_EXCL 标志以独占模式打开文件。
内部 ID:OTP-8670
内核 2.13.5.3
已修复的 Bug 和故障
修复了在内核 2.13.5.2 中引入的 Bug。
内部 ID:OTP-8686 辅助 ID:OTP-8643
内核 2.13.5.2
已修复的 Bug 和故障
在某些情况下,网络内核可能会挂起。(感谢 Scott Lystig Fritchie。)
内部 ID:OTP-8643 辅助 ID:seq11584
内核 2.13.5.1
已修复的 Bug 和故障
内核 2.13.5
已修复的 Bug 和故障
修复了影响
pg2:get_local_members/1
的竞争 Bug。该 Bug 是在 R13B03 中引入的。内部 ID:OTP-8358
在 SMP 模拟器中,本地代码的加载没有正确地原子化,这可能会导致崩溃。此外,本地代码的每个 MFA 信息表现在都用锁保护,因为它可以在 SMP 模拟器中并发访问。(感谢 Mikael Pettersson。)
内部 ID:OTP-8397
user.erl(在 oldshell 中使用)已更新以处理提示字符串中的 Unicode (io:get_line/{1,2})。io_lib 也已更新,以使用 't' 修饰符格式化提示符(即,~ts 而不是 ~s)。
内部 ID:OTP-8418 辅助 ID:OTP-8393
如果操作系统原生解析器配置错误,则解析器例程无法将自身节点名称查找为主机名,此 Bug 由 Yogish Baliga 报告,现已修复。
解析器例程现在会尝试将主机名解析为 IP 字符串,就像大多数操作系统解析器一样,除非使用原生解析器。
DNS 解析器 inet_res 和文件解析器 inet_hosts 现在只有在需要时才会读取操作系统配置文件。由于原生解析器是默认设置,因此在大多数情况下永远不需要它们。
如果不存在 'search' 关键字,DNS 解析器的操作系统配置文件数据自动更新 (/etc/resolv.conf) 现在使用 'domain' 关键字作为默认搜索域。
内部 ID:OTP-8426 辅助 ID:OTP-8381
改进和新功能
已更改 on_load 函数的预期返回值。(请参阅参考手册中有关代码加载的部分。)
*潜在的不兼容性*
内部 ID:OTP-8339
现在,存档文件中的显式顶层目录是可选的。
例如,如果存档 (app-vsn.ez) 仅包含 app-vsn/ebin/mod.beam 文件,则使用存档文件的文件信息作为来源,伪造 app-vsn 和 app-vsn/ebin 目录的文件信息。还可以列出虚拟目录。简而言之,如果顶层目录不存在,则它们是虚拟的。
内部 ID:OTP-8387
code:clash/0
现在会查找存档(.ez 文件)内部。(感谢 Tuncer Ayaz。)内部 ID:OTP-8413
现在有新的
gen_sctp:connect_init/*
函数,用于启动 SCTP 连接而不会阻塞结果。结果将异步地作为 sctp_assoc_change 事件传递。(感谢 Simon Cornish。)内部 ID:OTP-8414
内核 2.13.4
已修复的 Bug 和故障
修复了
m:pg2
中的链接。(感谢 Christophe Romain。)内部 ID:OTP-8198
一个定时器进程可能会因尝试向未响应的节点发送滴答声而被无限期地阻止。如果发生这种情况,则连接将不会像预期那样被关闭。
内部 ID:OTP-8218
修复了
pg2
中当死亡的成员未离开进程组时的 Bug。(感谢 Matthew Dempsky。)内部 ID:OTP-8259
改进和新功能
现在使用大多数平台上存在的开源工具(xsltproc 和 fop)构建文档。一个明显的变化是删除了框架。
内部 ID:OTP-8201
存档文件中的顶层目录不再需要具有
-vsn
后缀。例如,如果存档文件的名称像mnesia-4.4.7.ez
,则存档中的顶层目录可以命名为mnesia
或mnesia-4.4.7
。如果存档文件的名称像mnesia.ez
,则存档中的顶层目录必须像之前一样命名为mnesia
。内部 ID:OTP-8266
-on_load() 指令可用于在加载模块时运行函数。它记录在参考手册中有关代码加载的部分中。
内部 ID:OTP-8295
内核 2.13.3
改进和新功能
已重写、记录和发布 DNS 解析器客户端 inet_res。请参阅 inet_res(3) 和 Erts 用户指南:Inet 配置。
由于之前没有官方版本,因此它在形式上不会与早期版本不兼容。但是,它以前被使用过,并且一些细节已更改。
现在,无论节点以哪种分发模式启动,配置都从所有 Unix 平台上的 /etc/resolv.conf 和 /etc/hosts 初始化。这些文件应该驻留的目录 (/etc) 可以通过环境变量更改。也可以在 inet 配置中更改这些配置文件的位置。监视文件是否更改并重新读取,这使一些解析器配置变量脱离了应用程序的控制。/etc/hosts 条目现在有自己的缓存表,该表被应用程序配置的主机条目所屏蔽(如果使用查找方法“file”)。Matthew O'Gorman 很久以前报告了这个问题(即 inet_res 配置仅适用于分发模式的长名称)。
默认情况下,查找方法仍然仅为“native”。在所有 Unix 平台上都进行解析器配置,只是为了获得可用于直接调用 inet_res 的可用配置。
不再建议使用函数
inet_res:nslookup/3..5
和inet_res:nnslookup/4..4
,而是使用inet_res:lookup/3..5
和inet_res:resolve/3..5
,它们提供更清晰的参数类型以及在调用中覆盖选项的可能性。以前不受支持的 inet_res 版本的用户已包含内部头文件以访问内部记录定义,以便检查 DNS 回复。这仍然不受支持,并且 inet_dns 中有访问函数可供使用。这些在 inet_res(3) 中进行了说明。
Bug 修复:压缩引用循环会导致 DNS 消息解码永远循环。该问题由 Florian Weimer 报告。
Bug 修复和 Sergei Golovan 的修补建议:配置 IPv6 名称服务器不起作用。他的补丁(正如他警告的那样)创建了许多 UDP 套接字;每个名称服务器一个。这已在发布的版本中修复。
改进:
inet_res
现在具有 EDNS0 功能。当前实现很简单,不会探测和缓存名称服务器的 EDNS 信息,而一个功能完善的实现应该这样做。EDNS 必须通过解析器配置启用,如果名称服务器回复它不支持 EDNS,则inet_res
会回退到常规 DNS 查询。改进:现在,如果
inet_res
从名称服务器收到截断的答案,则会自动回退到 TCP。警告:
inet_res
和inet_dns
处理的一些古老且特殊的记录类型,当前版本的 BIND 并不支持,因此在重写后无法进行合理的测试,例如 MD、MF、NULL 和 SPF。这些特定记录中出现错误的风险仍然很低,因为它们的代码大部分与其他经过测试的记录类型共享。*潜在的不兼容性*
自有 ID:OTP-7955 辅助 ID:OTP-7107 OTP-6852
如果一个带有选项
{packet,4}
的 TCP 套接字接收到一个大小值非常大(>2Gb)的数据包头,则可能会导致模拟器崩溃。同样的错误导致erlang:decode_packet/3
返回错误的值。(感谢 Georgos Seganos。)自有 ID:OTP-8102
文件模块现在有一个类似于 io:get_line/2 的 read_line/1 函数,但具有面向字节的语义。函数 file:read_line/1 也适用于原始文件,但为了获得良好的性能,建议将其与原始文件访问的 'read_ahead' 选项一起使用。
自有 ID:OTP-8108
Kernel 2.13.2
已修复的错误和故障
修复了从以 latin1 以外的编码打开的文件执行 io:get_line(以及其他调用)时,导致出现错误的 Unicode 错误的问题。
自有 ID:OTP-7974
改进和新功能
添加了从系统获取更高分辨率时间戳的功能。erlang:now 函数返回的时间戳并不总是与实际操作系统时间一致(因为它可以抵御操作系统中较大的时间变化)。添加了 os:timestamp/0 函数,以获取与 erlang:now 返回的时间戳相似的时间戳,但不受 Erlang 时间校正和平滑算法的影响。os:timestamp 返回的时间戳始终与操作系统的时间视图一致,类似于用于获取挂钟时间的日历函数,但具有更高的分辨率。有关用法的示例可以在 os 手册页中找到。
自有 ID:OTP-7971
Kernel 2.13.1
已修复的错误和故障
对
os:cmd/1
的多个并发调用一次只会阻塞一个调度程序线程,如果操作系统分叉进程速度较慢,则可以使 smp 模拟器更具响应性。自有 ID:OTP-7890 辅助 ID:seq11219
修复了在节点启动期间执行 IO 操作的早期 RPC 挂起的问题。
自有 ID:OTP-7903 辅助 ID:seq11224
纠正了 gen_tcp 和 gen_udp 的错误行为。gen_tcp:connect/3,4 和 gen_udp:send/4 现在会为冲突的目标地址与套接字地址族返回 {error,eafnosupport}。结合不使用原生(OS)解析器(不是默认)的 IP 地址字符串主机名的其他极端情况也已更改为返回 {error,nxdomain} 而不是 {error,einval}。这些更改可能会让旧的现有代码感到惊讶。gen_tcp:listen/2 和 gen_udp:open/2 现在会因冲突的本地地址与套接字地址族而失败,而不是尝试使用错误的地址。该问题由 Per Hedeland 报告。
*潜在的不兼容性*
自有 ID:OTP-7929
改进和新功能
修复了 R13A 的 Unicode 和 I/O 系统实现中的几个故障和性能问题。
自有 ID:OTP-7896 辅助 ID:OTP-7648 OTP-7887
现在已改进了不受支持的 DNS 解析器客户端 inet_res,以处理 NAPTR 查询。
自有 ID:OTP-7925 辅助 ID:seq11231
Kernel 2.13
已修复的错误和故障
已更正旧的 Erlang DNS 解析器 inet_res,以处理包含多个字符串的 TXT 记录。补丁由 Geoff Cant 提供。
自有 ID:OTP-7588
当以只读模式块读取磁盘日志时,错误的术语可能会导致磁盘日志进程崩溃。
自有 ID:OTP-7641 辅助 ID:seq11090
gen_tcp:send()
有时(仅在 Solaris 上观察到)返回{error,enotconn}
,而不是预期的{error,closed}
,因为对等套接字已显式关闭。自有 ID:OTP-7647
inet 驱动程序中错误地解码了 gen_sctp 选项 sctp_peer_addr_params,#sctp_paddrparams{address={IP,Port}}。现在已纠正此错误。
自有 ID:OTP-7755
改进和新功能
Erlang 程序现在可以使用 io_server 'standard_error' 访问此类文件描述符可用的平台上的 STDERR,例如 io:format(standard_error,"~s~n",[ErrorMessage])。
自有 ID:OTP-6688
erlang:system_info(system_version)
返回的字符串格式(以及 Erlang 启动时的第一个消息)已更改。该字符串现在包含 OTP 版本号以及 erts 版本号。自有 ID:OTP-7649
从该版本开始,全局名称服务器不再支持运行 Erlang/OTP R10B 的节点。
自有 ID:OTP-7661
net_kernel:monitor_nodes/X
功能传递的{nodedown, Node}
消息现在保证在Node
从erlang:nodes/Y
返回的结果中删除后发送。自有 ID:OTP-7725
已删除已弃用的函数
erlang:fault/1
、erlang:fault/2
和file:rawopen/2
。*潜在的不兼容性*
自有 ID:OTP-7812
借助新的环境变量设置 ERL_EPMD_PORT,属于不同独立集群的节点现在可以在同一主机上共存。
自有 ID:OTP-7826
版权声明已更新。
自有 ID:OTP-7851
Kernel 2.12.5.1
已修复的错误和故障
当以只读模式块读取磁盘日志时,错误的术语可能会导致磁盘日志进程崩溃。
自有 ID:OTP-7641 辅助 ID:seq11090
从多个进程在带有选项
send_timeout
的套接字上调用gen_tcp:send()
可能会导致超时时间比指定的时间长得多。解决方案是一个新的套接字选项{send_timeout_close,true}
,它将在超时时自动关闭。随后对 send 的调用将立即失败,因为连接已关闭。自有 ID:OTP-7731 辅助 ID:seq11161
Kernel 2.12.5
已修复的错误和故障
更正了
rpc:pmap/3
的文档。(感谢 Kirill Zaborski。)自有 ID:OTP-7537
用于分布式 Erlang 协议的侦听套接字现在使用套接字选项 'reuseaddr',当您使用内核选项 'inet_dist_listen_min' 和 'inet_dist_listen_max' 强制侦听端口号并使用打开的连接重新启动节点时,此选项非常有用。
自有 ID:OTP-7563
修复了未关闭的 TCP 端口的内存泄漏。gen_tcp:send() 之后是失败的 gen_tcp:recv(),在某些情况下可能会导致端口在关闭后仍然存在。
自有 ID:OTP-7615
改进和新功能
使用
proc_lib
(包括gen_server
和其他使用proc_lib
的库模块)生成的进程不再保留初始调用的整个参数列表,而只保留元数。此外,如果使用
proc_lib:spawn/1
来生成一个 fun,则不会保留实际的 fun,而只保留实现该 fun 的模块、函数名和元数。更改的原因是,保留初始 fun(或参数列表中的 fun)会阻止升级该模块的代码。第二个原因是,保留 fun 和函数参数可能会浪费大量内存。
此更改的缺点是,崩溃报告将提供关于初始调用的不太精确的信息(只有
Module:Function/Arity
而不是Module:Function(Arguments)
)。函数proc_lib:initial_call/1
仍然返回一个列表,但每个参数都已替换为一个虚拟原子。自有 ID:OTP-7531 辅助 ID:seq11036
从标准输入读取时,
io:get_line/1
现在速度明显更快。当从以二进制模式打开的任何文件读取时,io:get_line/1
也有一些小的性能改进。(感谢 Fredrik Svahn。)自有 ID:OTP-7542
现在对从存档文件加载代码提供了实验性支持。有关更多信息,请参阅
code
、init
、erl_prim_loader
和escript
的文档。改进了
escripts
的错误处理。escript
现在可以为模拟器设置显式参数,例如-smp enabled
。escript
现在可以包含预编译的 beam 文件。escript
现在可以包含一个包含一个或多个应用程序的存档文件(实验性)。已删除内部模块
code_aux
。自有 ID:OTP-7548 辅助 ID:otp-6622
现在记录了
code:is_sticky/1
。(感谢 Vlad Dumitrescu。)自有 ID:OTP-7561
在作业控制模式下,“s”和“r”命令现在接受一个可选参数来指定启动哪个 shell。(感谢 Robert Virding。)
自有 ID:OTP-7617
如果在未使用
-sname
或-name
选项启动的模拟器中调用net_adm:world/0,1
,则可能会崩溃;现在它将返回一个空列表。(感谢 Edwin Fine。)内部 ID:OTP-7618
Kernel 2.12.4
已修复的 Bug 和故障
现在在 Windows 上可以处理大文件,前提是文件系统支持。
内部 ID:OTP-7410
改进和新特性
新的 BIF
erlang:decode_packet/3
,用于从二进制数据中提取协议数据包。类似于套接字选项{packet, Type}
。此外,还记录了套接字数据包类型http
并使其正式化。注意:从活动套接字发送的http
数据包的元组格式已进行了不兼容的更改。*潜在的不兼容性*
内部 ID:OTP-7404
现在对套接字设置
{active,once}
(使用 inets:setopts/2)进行了特殊优化(因为{active,once}
选项通常比其他选项更频繁地使用)。内部 ID:OTP-7520
Kernel 2.12.3
已修复的 Bug 和故障
现在 gen_sctp 可以处理 SCTP_ADDR_CONFIRMED 事件。
内部 ID:OTP-7276
当使用
pg2:leave/2
离开进程组时,该进程被错误地假定为该组的成员。此错误已修复。内部 ID:OTP-7277
在 Erlang shell 中,使用上下箭头键时,有时会检索到错误的上一条命令。
内部 ID:OTP-7278
erlang:trace/3
的文档已得到更正。内部 ID:OTP-7279 辅助 ID:seq10927
在 SMP 模拟器中,存在一个小风险,即
code:purge(Mod)
会杀死一个在Mod
中运行代码的进程,并在该进程终止之前卸载模块Mod
。code:purge(Mod)
现在会等待确认(使用erlang:monitor/2
)进程已被杀死,然后再继续。内部 ID:OTP-7282
当膨胀数据的大小正好是内部缓冲区大小(默认为 4000 字节)的倍数时,
zlib:inflate
会失败。内部 ID:OTP-7359
改进和新特性
现在可以在环境变量 ERL_LIBS 中指定其他库目录。请参阅
code
模块的手册页。(感谢 Serge Aleynikov。)内部 ID:OTP-6940
改进了 crypto 和 zlib 驱动程序,以允许并发的 SMP 访问。
内部 ID:OTP-7262
有一个新的函数
init:stop/1
,可用于干净地关闭系统并生成非零退出状态或崩溃转储。(感谢 Magnus Froberg。)内部 ID:OTP-7308
现在记录了
open_port/2
的hide
选项。(感谢 Richard Carlsson。)内部 ID:OTP-7358
Kernel 2.12.2.1
改进和新特性
现在,Unix 平台上的
os:cmd/1
使用/bin/sh
作为 shell,而不是在PATH
环境中查找sh
。内部 ID:OTP-7283
Kernel 2.12.2
已修复的 Bug 和故障
修复了由
disk_log
和pg2
之间的竞争条件引起的 Bug。内部 ID:OTP-7209 辅助 ID:seq10890
beta 测试模块
gen_sctp
现在按照文档所述支持活动模式。活动模式仍然未经充分测试,并且关于gen_sctp:connect/5
的正确语义存在一些问题。特别是:它应该是阻塞的还是非阻塞的,还是可选择的。它很可能会在(不久的)将来的补丁中改变语义。试试看,提出意见并发送 Bug 报告!
内部 ID:OTP-7225
改进和新特性
erlang:system_info/1
现在接受logical_processors
和debug_compiled
参数。有关更多信息,请参阅erlang
文档。如果模拟器使用的调度器线程数大于系统上的逻辑处理器数量,则
test_server:timetrap_scale_factor/0
返回的缩放因子现在也会受到影响。内部 ID:OTP-7175
更新了
erlang:function_exported/3
和io:format/2
函数的文档,不再声明这些函数主要为了向后兼容而保留。内部 ID:OTP-7186
现在,执行
processes/0
BIF 的进程可以在执行期间被其他进程抢占。这是为了尽可能少地干扰系统的其余部分。当然,返回的结果仍然是在调用processes/0
期间现有进程的一致快照。更新了
processes/0
BIF 和is_process_alive/1
BIF 的文档,以阐明现有进程和处于活动状态的进程之间的区别。内部 ID:OTP-7213
在文档中,
tuple_size/1
和byte_size/1
已替换为size/1
。内部 ID:OTP-7244
Kernel 2.12.1.2
改进和新特性
现在,
erlang:system_info/1
接受{allocator_sizes, Alloc}
和alloc_util_allocators
参数。有关更多信息,请参阅erlang
文档。内部 ID:OTP-7167
Kernel 2.12.1.1
已修复的 Bug 和故障
修复了组中可能导致 ssh 服务器丢失答案或挂起的问题。
内部 ID:OTP-7185 辅助 ID:seq10871
Kernel 2.12.1
已修复的 Bug 和故障
file:read/2 和 file:consult_stream/1,3 未在 I/O 设备上使用空提示符。此错误现已更正。
内部 ID:OTP-7013
已更新 sctp 驱动程序以与较新的 lksctp 包(例如,使用 API 拼写更改 adaption -> adaptation 的 1.0.7)一起使用。较旧的 lksctp (1.0.6) 仍然有效。gen_sctp.erl 和 inet_sctp.hrl 中的 Erlang API 现在拼写为“adaptation”,而不管底层的 C API 如何。
*潜在的不兼容性*
内部 ID:OTP-7120
改进和新特性
已更新文档,以反映 Erlang shell 的最新更新以及
io_lib
模块的控制序列p
的微小修改。已从代码示例和 Erlang shell 示例中删除多余的空行。
内部 ID:OTP-6944 辅助 ID:OTP-6554, OTP-6911
tuple_size/1
和byte_size/1
已替换为size/1
。内部 ID:OTP-7009
Kernel 2.12
已修复的 Bug 和故障
修复了读取 0 字节的原始文件返回“eof”而不是空数据的 Bug。
内部 ID:OTP-6291 辅助 ID:OTP-6967
修复了 David Baird 报告并由 Dialyzer 发现的 gen_udp:fdopen 中的 Bug。
内部 ID:OTP-6836 辅助 ID:OTP-6594
多次调用
error_logger:tty(true)
不会给出多个错误日志输出。内部 ID:OTP-6884 辅助 ID:seq10767
当使用命令行标志
-connect_all false
时,全局名称服务器现在会忽略nodeup
消息。(感谢 Trevor Woollacott。)内部 ID:OTP-6931
对于足够奇怪的文件系统问题(例如写入已满的文件系统),file:write_file/3、file:write/2 和 file:read/2 可能会崩溃(与文档相反)。此 Bug 现已更正。
在此过程中,文件模块已重写以产生更好的错误代码。Posix 错误代码现在源于操作系统文件系统调用,或者仅针对非常相似的原因生成(例如,如果内存分配失败,则生成“enomem”,如果 Erlang 中的文件句柄是文件句柄但当前无效,则生成“einval”)。
现在生成了更多 Erlang 式的错误代码。例如,如果参数不是文件句柄类型,则现在从
file:close/1
返回{error,badarg}
。请参阅 file(3)。已删除使用
file:write/2
写入单个字节而不是一个字节的列表或二进制文件的可能性,这与文档相矛盾。*潜在的不兼容性*
内部 ID:OTP-6967 辅助 ID:OTP-6597 OTP-6291
当实际堆和/或堆栈很大时,系统监视功能产生的监视器消息和垃圾回收跟踪消息可能包含错误的堆和/或堆栈大小。
从 erts 版本 5.6 开始,
erlang:system_monitor/[1,2]
的large_heap
选项已被修改。如果为所有堆世代分配的所有内存块的大小总和等于或大于指定大小,则会发送监控消息。之前,如果为最年轻世代分配的内存块等于或大于指定大小,则会发送监控消息。*潜在的不兼容性*
自属 ID: OTP-6974 辅助 ID: seq10796
inet:getopts/2
在 Windows Vista 上返回随机值。自属 ID: OTP-7003
改进和新功能
对 file:pread/2 和 file:pread/3 进行了细微的文档更正。
自属 ID: OTP-6853
已删除已弃用的函数
file:file_info/1
、init:get_flag/1
、init:get_flags/0
和init:get_args/0
。*潜在的不兼容性*
自属 ID: OTP-6886
内核和 STDLIB 中模块的契约指令。
自属 ID: OTP-6895
添加了函数 io:columns/0、io:columns/1、io:rows/0 和 io:rows/1,允许用户获取有关终端几何的信息。 shell 在格式化输出时会利用这一点。对于高度和宽度不适用的常规文件和其他 io 设备,这些函数返回 {error,enotsup}。
潜在的不兼容性:如果有人编写了自定义 io-handler,则该 handler 必须返回错误或处理有关终端高度和宽度的 io 请求。通常这不是问题,因为 io-handlers 按经验法则,在收到未知 io 请求时应给出错误回复,而不是崩溃。
*潜在的不兼容性*
自属 ID: OTP-6933
已删除未记录且不受支持的函数
inet:ip_to_bytes/1
、inet:ip4_to_bytes/1
、inet:ip6_to_bytes/1
和inet:bytes_to_ip6/16
。自属 ID: OTP-6938
向
zlib
添加了新的校验和组合函数。并修复了zlib:deflate
中的一个错误。感谢 Matthew Dempsky。自属 ID: OTP-6970
spawn_monitor/1
和spawn_monitor/3
BIF 现在是自动导入的(即,它们不再需要erlang:
前缀)。自属 ID: OTP-6975
如果使用明显错误的参数(例如,当期望原子时使用元组)调用
code
模块中的所有函数,则现在会失败并抛出异常。某些函数现在也会因未记录的参数类型而失败(例如,ensure_loaded/1
现在仅接受文档中记录的原子;它过去也接受字符串)。Dialyzer 通常会为任何使用未记录参数类型的调用发出警告。即使调用在 R12B 中仍然有效,你也应该更正你的代码。未来的版本将遵守文档。
*潜在的不兼容性*
自属 ID: OTP-6983
内核 2.11.5.2
修复的错误和故障
如果网络通信发生瞬时故障期间发出大量并行发送,则内核参数 dist_auto_connect 可能会阻止节点。
自属 ID: OTP-6893 辅助 ID: seq10753
内核 2.11.5.1
修复的错误和故障
内部(很少使用)DNS 解析器已被修改为在被要求解析绝对名称(带有终止点的名称)时,不使用域搜索列表。还有一个错误导致它为绝对名称创建格式错误的 DNS 查询,该错误已得到纠正,该纠正由 Scott Lystig Fritchie 建议。代码也已更正为以与未缓存相同的搜索顺序查找缓存的 RR,现在允许在搜索域中包含根域,并且现在实际上可以执行区域传输请求。
*潜在的不兼容性*
自属 ID: OTP-6806 辅助 ID: seq10714 EABln35459
如果调用进程启用了 trap_exit 标志,则 zlib:close/1 会在消息队列中留下一个 EXIT 消息。
自属 ID: OTP-6811
改进和新功能
已更新
process_flag(priority, Level)
的文档,请参阅erlang
文档。自属 ID: OTP-6745 辅助 ID: OTP-6715
内核 2.11.5
修复的错误和故障
已更新 shell 以修复以下缺陷:如果不使用 oldshell,shell 进程退出会导致初始 shell 无响应。使用不存在的回调模块启动受限 shell 会导致 shell 中无法使用任何命令,甚至 init:stop/0 也无法使用。当 restricted_shell 处于活动状态时,Fun 不能用作本地 shell 函数(在 shell_default 或 user_default 中)的参数。
自属 ID: OTP-6537
未记录的功能 gen_tcp:fdopen/2 在 R11B-4 中被破坏。现在它又被修复了。
自属 ID: OTP-6615
纠正了 inet_res 模块中三个位置的计时器取消。(Dialyzer 发现的问题。)
自属 ID: OTP-6676
改进和新功能
更正了 SCTP 的套接字选项 SO_LINGER、SO_SNDBUF 和 SO_RCVBUF 的协议层流程。
自属 ID: OTP-6625 辅助 ID: OTP-6336
改进并记录了对等关闭时 inet 选项 {active,once} 的行为。
自属 ID: OTP-6681
为面向连接的套接字添加了 inet 选项 send_timeout,以便在向底层 TCP 堆栈发送发送请求时允许超时。
自属 ID: OTP-6684 辅助 ID: seq10637 OTP-6681
细微的 Makefile 更改。
自属 ID: OTP-6689 辅助 ID: OTP-6742
已更新
process_flag(priority, Level)
的文档,请参阅erlang
文档。自属 ID: OTP-6715
内核 2.11.4.2
改进和新功能
process_flag/2 接受新标志
sensitive
。自属 ID: OTP-6592 辅助 ID: seq10555
内核 2.11.4.1
修复的错误和故障
已修复 gen_udp:open 中破坏 'fd' 选项的错误。
自属 ID: OTP-6594 辅助 ID: seq10619
内核 2.11.4
修复的错误和故障
为
error_logger
函数error_msg/1,2
、warning_msg/1,2
和info_msg/1,2
的文档添加了警告,警告使用错误参数调用这些函数可能会使标准事件处理程序崩溃。自属 ID: OTP-4575 辅助 ID: seq7693
纠正了
inet_db
中有关获取解析器选项retry
的错误。自属 ID: OTP-6380 辅助 ID: seq10534
通过调用
global:register_name()
或global:re_register_name()
注册的名称在注册或已注册的进程死亡时并不总是取消注册。此错误已修复。自属 ID: OTP-6428
当将内核配置参数
error_logger
设置为false
时,文档说明“未安装错误记录器处理程序”。这是正确的,但错误日志记录并未关闭,因为保留了初始的原始错误记录器事件处理程序,将原始事件消息打印到 tty。更改此行为可以视为向后不兼容的更改。相反,为配置参数添加了一个新值
silent
,以确保完全关闭错误日志记录。自属 ID: OTP-6445
澄清了
code:lib_dir/1
和code:priv_dir/1
的文档。这些函数遍历代码路径的名称,它们不搜索实际的目录。自属 ID: OTP-6466
当仅使用
expand_fun
参数调用时,io:setopts
返回{error,badarg}
。(感谢 igwan。)自属 ID: OTP-6508
改进和新功能
已实现面向 SCTP 套接字 API 扩展的接口。这是 Serge Aleynikov 和 Leonid Timochouk 提供的开源补丁。Erlang 代码部分已由 OTP 团队改编,稍微更改了 Erlang API。
Erlang 接口由模块
gen_sctp
和包含选项记录定义的 include 文件-include_lib("kernel/include/inet_sctp.hrl").
组成。gen_sctp
模块已记录。在 OTP 团队重写之前,交付的开源补丁是根据 http://tools.ietf.org/html/draft-ietf-tsvwg-sctpsocket-13 编写的,并且声称工作正常,在 Linux Fedora Core 5.0(内核 2.6.15-2054 或更高版本)以及 Solaris 10 和 11 上进行了测试。OTP 团队的重写使用了相同的标准文档,但可能意外地破坏了一些功能。如果是这样,它将很快被修补到工作状态。C 中的棘手部分和总体设计基本没有改变。在重写期间,代码在 SuSE Linux Enterprise Server 10 上进行了手动测试,并在 Solaris 10 上进行了简短的测试。非常感谢对代码和文档的反馈。
SCTP 接口处于 beta 状态。它仅经过了手动测试,并且在 OTP 中没有自动测试套件,这意味着一切肯定都没有经过测试。套接字活动模式已损坏。未测试 IPv6。由于 API 更改,文档已重新编写,但在此之后尚未校对。
OTP 团队感谢 Serge Aleynikov 和 Leonid Timochouk 的宝贵贡献。我们希望我们没有把它搞砸太多。
自属 ID: OTP-6336
term_to_binary/2
现在可以识别{minor_version,Version}
选项。与之前的编码相比,{minor_version,1} 将导致浮点数以精确且更节省空间的方式进行编码。自属 ID: OTP-6434
节点的监控已得到改进。现在,以下属性适用于
net_kernel:monitor_nodes/[1,2]
nodeup
消息将在传递通过新建连接的远程节点的任何消息之前传递。nodedown
消息在传递通过连接的远程节点的所有消息都已传递之前,将不会传递。- 订阅也可以在
net_kernel
服务器启动之前进行。
自有 ID:OTP-6481
现在允许以“原始”方式设置和获取套接字选项。使用此功能不可避免地会产生不可移植的代码,但允许在具有这些选项的 TCP 堆栈上设置和获取任意不常见的选项。
自有 ID:OTP-6519
已消除 Dialyzer 警告。
自有 ID:OTP-6523
已更新
file:delete/1
和file:set_cwd/1
的文档,以明确说明如果输入参数类型不正确会发生什么情况。自有 ID:OTP-6535
Kernel 2.11.3.1
已修复的错误和故障
在两个 Erlang 节点之间新建立的连接中,第一个传递的消息可能会使用错误的包大小。这可能导致消息被丢弃或连接终止。
自有 ID:OTP-6473
Kernel 2.11.3
已修复的错误和故障
在 Unix 上,
unix:cmd/1
函数可能会在调用进程的消息队列中留下一个“EXIT”消息。这个问题在 SMP 模拟器中更可能发生。自有 ID:OTP-6368
改进和新功能
在 erl_ddll 中添加了更多接口,以支持不同的使用场景。
自有 ID:OTP-6307 辅助 ID:OTP-6234
调用
global:set_lock()
设置的锁在锁定进程终止时并不总是被删除。此错误已修复。自有 ID:OTP-6341 辅助 ID:seq10445
Kernel 2.11.2
已修复的错误和故障
在 R11B-1 中,使用 dist_auto_connect 时,节点消失的情况下的行为发生了一次更改。关于正常分布式操作的超时现在恢复到旧的(R11B-1 之前)状态。
自有 ID:OTP-6258 辅助 ID:OTP-6200,seq10449
消除了
inet:gethostbyname()
函数使用的内部进程的启动问题。如果内部进程(inet_gethost_native
)之前没有启动,并且如果多个进程同时调用inet:gethostbyname()
函数之一,则调用可能会失败。自有 ID:OTP-6286
改进和新功能
代码清理:已删除旧的内部过时的 file_server。它仅在与 R7 及更旧版本的节点通信时使用。
自有 ID:OTP-6245
尝试打开不存在或格式错误的磁盘日志不再会导致崩溃报告。特别是,当参数不是格式正确的磁盘日志文件时,
ets:file2tab/1
不会报告错误。(返回值没有改变,仍然是一个错误元组。)自有 ID:OTP-6278 辅助 ID:seq10421
有新的 BIF
erlang:spawn_monitor/1,3
,以及用于spawn_opt/2,3,4,5
的新选项monitor
。已更新
observer_backend
模块以处理新的 BIF。自有 ID:OTP-6281
为了帮助 Dialyzer 发现更多错误,Kernel 和 STDLIB 应用程序中的许多函数现在只接受文档中指定的类型的参数。
例如,文档中说明函数
lists:prefix/2
和lists:suffix/2
只接受列表作为参数,但实际上它们接受任何内容并返回false
。现在已更改为如果一个或两个参数不是列表,则函数会引发异常。此外,文档说明
string:strip/3
函数接受一个字符参数,该字符是从字符串的一个或两个末尾剥离的字符。如果给定一个列表而不是字符,它过去不会执行任何操作,但现在会引发异常。Dialyzer 将发现大多数将错误类型的参数传递给这些函数的情况。
*潜在的不兼容性*
自有 ID:OTP-6295
Kernel 2.11.1.1
改进和新功能
现在有一个用于 UDP 套接字的 read_packets 选项,该选项设置每次调用套接字驱动程序将读取的最大 UDP 数据包数量。
自有 ID:OTP-6249 辅助 ID:seq10452
Kernel 2.11.1
已修复的错误和故障
在 R11B-0 中,始终启动 erl_ddll 服务器进程。尽管如此,Kernel 应用程序的配置参数
start_ddll
仍然被遵守,这将导致 erl_ddll 服务器启动两次(并导致系统关闭)。在此版本中,不再使用start_ddll
,并且已删除其文档。自有 ID:OTP-6163
内核选项 {dist_auto_connect,once} 可能会阻止从未连接的节点,导致网络持续分区。此外,网络的部分重启可能会导致全局名称数据库不一致。这两个问题现在都已解决。
自有 ID:OTP-6200 辅助 ID:seq10377
改进和新功能
现在从调用 gen_tcp:close/1、gen_udp:close/1 和 inet:close/1 的进程的消息队列中删除延迟到达的 tcp_closed 和 udp_closed 消息。
自有 ID:OTP-6197
Kernel 2.11
已修复的错误和故障
当修复具有损坏索引文件(例如,由硬盘故障引起)的磁盘日志时,索引文件的旧内容将保持不变。这将导致重复尝试打开磁盘日志每次都失败。
自有 ID:OTP-5558 辅助 ID:seq9823
以前,
unlink/1
和erlang:demonitor/2
的行为是完全异步的。但这有一个不良影响。您永远无法知道何时保证您不会受到已取消链接的链接或已取消监控的监视器的影响。unlink/1
和erlang:demonitor/2
的新行为可以看作是原子执行的两个操作。异步发送取消链接信号或取消监视信号,并忽略将来链接或监视器的任何结果。注意:此更改可能会导致一些以前没有失败的晦涩代码失败。例如,以下代码可能会挂起
Mon = erlang:monitor(process, Pid), %% ... exit(Pid, bang), erlang:demonitor(Mon), receive {'DOWN', Mon, process, Pid, _} -> ok %% We were previously guaranteed to get a down message %% (since we exited the process ourself), so we could %% in this case leave out: %% after 0 -> ok end,
*潜在的不兼容性*
自有 ID:OTP-5772
已清理应用程序启动失败并可能导致运行时系统停止时的行为,包括修复一些小错误。
application_controller
现在应始终使用非嵌套字符串终止,这意味着erl_crash.dump
中的标语应始终易于阅读。init
现在确保传递给erlang:halt/1
的标语不超过允许的最大长度。已从原始
error_logger
事件处理程序中删除了对list_to_atom/1
的冗余调用。(感谢 Serge Aleynikov 指出这一点)。这些更改仅影响错误消息和崩溃转储文件标语的内容。
自有 ID:OTP-5964
erl_ddll
服务器现在在 OTP 启动时启动,并置于 Kernel supervisor 下。这修复了几个小问题。它过去是按需启动的。已删除
erl_ddll
模块中start
和stop
函数的文档,因为这些函数不应被其他应用程序使用。此外,
erl_ddll:stop/1
函数不再终止erl_ddll
服务器,因为这会终止整个运行时系统。自有 ID:OTP-6033
改进和新功能
从
application_master
中删除了一些未使用的函数。自有 ID:OTP-3889
Global 不再允许在多个名称下注册进程。如果需要旧的(有错误的)行为,则可以为 Kernel 应用程序变量
global_multi_name_action
指定值allow
。自有 ID:OTP-5640 辅助 ID:OTP-5603
已消除编译
erlang.erl
文件时显示的(略有误导性的)警告。自有 ID:OTP-5947
auth
模块 API 已弃用。自有 ID:OTP-6037
添加了
erlang:demonitor/2
,从而可以在同时刷新接收到的'DOWN'
消息(如果存在)的情况下进行操作。请参阅erlang
。自有 ID:OTP-6100 辅助 ID:OTP-5772
Kernel 2.10.13
已修复的错误和故障
现在可以在 Solaris 8 上处理大文件(大于 2 GB)。
自有 ID:OTP-5849 辅助 ID:seq10157
在启动期间,
inet_gethost_native
留下了一条垃圾{'DOWN', ...}
消息,这导致了启动代码服务器的问题。自有 ID:OTP-5978 辅助 ID:OTP-5974
改进和新功能
现在,
global
在维护完全连接的网络时,会多次尝试连接节点。有时在非常大的负载下需要多次尝试。自有 ID:OTP-5889
现在,
erl_epmd
在调用gen_server:call
时显式将超时设置为infinity
。在非常大的负载下,旧的 15 秒超时可能会超时。自有 ID:OTP-5959
修正了代码服务器的启动,使其使用引用标记的元组,以确保发送到父进程的意外消息不会导致系统停止。同时移除了
code.erl
和code_server.erl
中无用的start/*
函数,并且不再从code_server.erl
导出init
函数。自有 ID: OTP-5974 辅助 ID: seq10243, OTP-5978
Kernel 2.10.12
修复的错误和故障
修复了
global
中的一个错误:锁定进程将nonode@nohost
添加到要锁定的节点列表中。这可能发生在任何节点被全局名称服务器知道之前。根据网络配置,症状是延迟。自有 ID: OTP-5792 辅助 ID: OTP-5563
如果缺少
.app
文件,则application:load/1
返回的错误原因已更正为{"no such file or directory", "FILE.app"}
,而不是不太明确的{"unknown POSIX error","FILE.app"}
。自有 ID: OTP-5809
错误修复:
disk_log:accessible_logs/0
不再将所有pg2
进程组报告为分布式磁盘日志;disk_log:pid2name/1
无法识别分布式磁盘日志的进程。自有 ID: OTP-5810
函数
file:consult/1
,file:path_consult/2
,file:eval/1,2
,file:path_eval/2,3
,file:script/1,2
,file:path_script/2,3
现在在错误元组中返回正确的行号。自有 ID: OTP-5814
如果引导脚本中有用户定义的变量,并且没有使用
-boot_var
选项提供它们的值,则模拟器将拒绝启动并显示令人困惑的错误消息。已更正为显示清晰易懂的消息。修改了
prim_file
模块,使其不依赖于lists
模块,以便可以使用用户定义的加载器启动模拟器。(感谢 Martin Bjorklund。)自有 ID: OTP-5828 辅助 ID: seq10151
对打开模式的描述进行了小幅更正。(感谢 Richard Carlsson。)
自有 ID: OTP-5856
改进和新特性
application_controller
现在以实际错误原因终止,而不是shutdown
。这意味着在应用程序出错导致运行时系统终止的情况下,崩溃转储现在应该更具信息量。示例:如果(永久)应用程序
app1
启动失败,则标语现在将是:“Kernel pid terminated (application_controller) ({application_start_failure,app1,{shutdown, {app1,start,[normal,[]]}}})
”而不是之前的 “
Kernel pid terminated (application_controller) (shutdown)
”。自有 ID: OTP-5811
Kernel 2.10.11.1
修复的错误和故障
计时器有时可能会过早超时。此错误现已修复。
引入了对
erlang:send_after(Time,
pid(), Msg) 和erlang:start_timer(Time,
pid(), Msg) 创建的计时器的自动取消。使用 pid 指定接收者的计时器,将在接收者退出时自动取消。有关更多信息,请参阅erlang
手册页。为了能够在不增加维护成本的情况下维护大量的计时器,内部计时器轮和 bif 计时器表已扩大。
还实现了一些小的 bif 计时器优化。
自有 ID: OTP-5795 辅助 ID: OTP-5090, seq8913, seq10139, OTP-5782
改进和新特性
文档改进
- 修正了
erlang:link/1
的文档- 添加了命令行标志
-code_path_cache
-
erl
命令行标志说明-
net_kernel
说明自有 ID: OTP-5847
Kernel 2.10.11
修复的错误和故障
全局名称注册工具中的多个错误修复和改进(请参阅
global
)- 名称解析过程并非总是取消链接不再注册的进程;
- 当
nodedown
紧随nodeup
时,全局名称有时可能会挂起; - 当节点关闭时,全局名称并非总是注销;
- 现在可以在全局名称服务器解析名称的同时设置和删除锁——全局锁的处理已与全局名称的注册分离;
从这个版本开始,
global
不再支持运行 Erlang/OTP R7B 或更早版本的节点。*潜在的不兼容性*
自有 ID: OTP-5563
函数
global:set_lock/3
和global:trans/4
现在接受Retries
参数的值0
(零)。自有 ID: OTP-5737
如果
inet:getaddr(Addr, Family)
的Addr
参数是包含 IP 地址的 4 元组或 8 元组,则不再对其进行验证,除非元组的大小以及它包含正确范围内的整数。此更改的原因是验证可能会导致以下调用序列失败
{ok,Addr} = inet:getaddr(localhost, inet6), gen_tcp:connect(Addr, 7, [inet6])
自有 ID: OTP-5743
改进和新特性
以前未记录且不受支持的
zlib
模块已以不兼容的方式更新,并且纠正了许多错误。现在也已记录在案。*潜在的不兼容性*
自有 ID: OTP-5715
添加了
application
接口函数which_applications/1
、set_env/4
和unset_env/3
,它们接受一个额外的Timeout
参数。用于标准 gen_server 超时(5000 毫秒)不适用的情况。自有 ID: OTP-5724 辅助 ID: seq10083
改进了有关使用包含的应用程序(使用启动阶段和
application_starter
)同步启动应用程序的文档。自有 ID: OTP-5754
为支持它们的平台(目前仅限 Linux)添加了新的套接字选项
priority
和tos
。自有 ID: OTP-5756
全局名称服务器在维护完全连接的网络方面进行了优化。
自有 ID: OTP-5770
Kernel 2.10.10.1
修复的错误和故障
本机解析器已获得用于扩展调试和软重启的控制 API。它是:
inet_gethost_native:control(Control)
Control = {debug_level,Level} | soft_restart
Level = 范围为 0-4 的整数
.自有 ID: OTP-5751 辅助 ID: EABln25013
Kernel 2.10.10
修复的错误和故障
如果多个进程(在同一节点上)同时尝试启动同一个分布式应用程序,则可能导致
application:start
返回错误值,甚至挂起。自有 ID: OTP-5606 辅助 ID: seq9838
改进和新特性
已更新大多数 Kernel 模块和一些 STDLIB 模块的手册页,特别是关于类型定义。
更正了
erts:info/1
返回值的文档。erlang:statistics/1
的文档现在列出了所有可能的参数。自有 ID: OTP-5360
当本机解析器无法进行
gethostbyaddr
查找时,应返回nxdomain
。不应尝试回退到仅当 IP 地址语法有效时才成功的例程。这已修复。自有 ID: OTP-5598 辅助 ID: OTP-5576
用新的
fun M:F/A
结构替换了一些元组 funs。lists
模块中的高阶函数在任何情况下都不再接受错误的 funs。'lists:map(bad_fun, [])
' 过去返回 '[]
',但现在会导致异常。删除了
ets
模块中未使用、已损坏的兼容性代码。(感谢 Dialyzer。)消除了 Dialyzer 在 Appmon 应用程序中发现的 5 个差异。
自有 ID: OTP-5633
添加了在配置文件(使用
-config
标志指定的文件)中元组列表后添加注释的可能性。自有 ID: OTP-5661 辅助 ID: seq10003
Kernel 2.10.9
修复的错误和故障
如果
sys.config
文件在点号之后完全没有任何空格,则 `erl -config sys.config
` 将无法启动。(感谢 Anders Nygren。)自有 ID: OTP-5543
已修复一个关于 TCP 套接字的错误,该错误会导致挂起的
gen_tcp:send/2
。要遇到此错误,您需要一个进程从套接字读取数据,一个进程写入比读取进程读取的更多的数据,从而导致发送者被挂起,然后读取进程关闭套接字。(由 Alexey Shchepin 报告和诊断。)更正了
gen_tcp
中(未文档化且不受支持的)选项{packet,http}
中的一个错误。(感谢 Claes Wikstrom 和 Luke Gorrie。)更新了关于
gen_tcp:recv/2
的第二个参数,即要接收的Length
的文档。自有 ID: OTP-5582 辅助 ID: seq9839
改进和新特性
在启动时,Erlang 解析器主机表被用于查找本地(以及可能独立的)主机的名称。这是不正确的。现在使用配置的解析器方法来实现此目的。
自有 ID: OTP-5393
现在已对
erlang:port_info/1
BIF 进行了文档化。对erlang:port_info/2
的文档进行了小幅更正。在
math
模块的文档中添加了一条说明,即并非所有函数在所有平台上都可用。在 ERTS 文档的
erl
手册页中添加了有关+c
选项的更多信息。自有 ID: OTP-5555
新的
fun M:F/A
构造创建一个 fun,该 fun 引用M:F/A
的最新版本。此语法旨在替换存在许多问题的元组 fun{M,F}
。新的类型测试
is_function(Fun,A)
(可以在 guards 中使用)测试Fun
是否是可以使用A
个参数应用的 fun。(目前,Fun
也可以是一个元组 fun。)自有 ID: OTP-5584
根据文档,
global
实现了与register/2
等效的功能,如果进程已经注册,则会返回badarg
。事实证明,在global
中没有检查一个进程是否以多个名称注册。如果某些进程意外地或有意地被赋予多个名称,则由于在发现名称冲突时调用 resolve 函数的方式(请参阅global
中的register_name/3
),名称注册表可能会变得不一致。在 OTP R11B 中,
global
将不允许以多个名称注册进程。为了帮助查找将返回no
的代码,此处引入了一个 Kernel 应用程序变量global_multi_name_action
。根据其值(info
、warning
或error
),当global
发现某些进程被赋予多个名称时,会将消息发送到错误记录器。该变量仅影响定义它的节点。自有 ID: OTP-5603
Kernel 2.10.8
改进和新特性
在发生 DNS 查找循环的情况下,
inet_db:getbyname
最终会构建一个无限列表。此问题已修复。自有 ID: OTP-5449
当对 IPv4 地址执行
inet6
名称查找时,可能会以 IPv4 格式返回地址。此问题已更正。还更正了一些关于 IPv6 名称查找的其他小的不一致之处。自有 ID: OTP-5576
Kernel 2.10.7
已修复的错误和故障
在某些情况下,
net_kernel
可能会发出虚假的 nodedown 消息。此错误已修复。自有 ID: OTP-5396
删除了
kernel
手册页中keep_zombies
配置参数的描述。自有 ID: OTP-5497
改进和新特性
消除了
init
和prim_file
模块中的 Dialyzer 警告(由死代码引起)。自有 ID: OTP-5496
inet_config
现在还会检查环境变量ERL_INETRC
以查找可能的用户配置文件。有关详细信息,请参阅 ERTS 用户指南。自有 ID: OTP-5512
Kernel 2.10.6
改进和新特性
引入了
+B
标志的c
选项,该选项可以使用 Ctrl-C(在 Windows 上为 Ctrl-Break)来中断 shell 进程,而不是调用模拟器中断处理程序。所有新的+B
选项现在也都在 Windows (werl) 上支持。此外,Windows 上的 Ctrl-C 现在已保留用于复制文本(以前使用 Ctrl-Ins)。Ctrl-Break 应用于中断处理。最后,更新了系统标志的文档。自有 ID: OTP-5388
为了在 STDLIB 1.13.1 中实现向后兼容性,重新引入了与系统其余部分并行启动 Erlang shell 的可能性。现在用于此目的的标志称为
async_shell_start
,并且已对其进行文档化。从 JCL 菜单启动的新 shell 不再与init
同步。这使得即使初始 shell 没有启动,也可以启动新的 shell(例如,用于调试目的)。自有 ID: OTP-5406 辅助 ID: OTP-5218
Kernel 2.10.5
已修复的错误和故障
删除了
erlang:binary_to_float/1
的文档。BIF 本身在几个版本前已删除。自有 ID: OTP-5391
改进和新特性
添加了接受标志和选项列表的
net_kernel:monitor_nodes/2
。通过使用net_kernel:monitor_nodes/2
,可以订阅带有额外信息的nodeup/nodedown
消息。现在可以监视隐藏节点,并获取nodedown
原因。有关更多信息,请参阅net_kernel
文档。自有 ID: OTP-5374
Kernel 2.10.4
已修复的错误和故障
应用程序的应用程序主进程现在可以更快地终止应用程序,从而降低系统中其他部分出现超时的风险。
自有 ID: OTP-5363 辅助 ID: EABln19084
添加了一个 BIF
erlang:raise/3
。有关详细信息,请参阅手册。它仅用于内部系统编程,高级错误处理。自有 ID: OTP-5376 辅助 ID: OTP-5257
Kernel 2.10.3
改进和新特性
使用
-eval
标志(erl -eval Expr
),可以在系统初始化期间评估任意表达式。这在init
中有文档记录。自有 ID: OTP-5260
已删除不受支持和未文档化的模块
socks5
、socks5_auth
、socks5_tcp
和socks5_udp
。自有 ID: OTP-5266
Kernel 2.10.1
已修复的错误和故障
Pman 的“跟踪 shell”功能已损坏,现在已修复。此外,如果节点上运行多个 shell 进程,则 Pman 无法正确找到活动 shell 的 pid。此问题也已得到更正。
自有 ID: OTP-5191
删除了不再存在的
auth:open/1
函数的文档。(感谢 Miguel Barreiro。)自有 ID: OTP-5208
更正了未文档化且不受支持的
zlib
模块中的crc32/3
函数。自有 ID: OTP-5227
改进和新特性
您现在可以使用
-rsh
标志启动 Erlang,这将为您提供远程初始 shell 而不是本地 shell。示例:erl -sname this_node -rsh other_node@other_host
自有 ID: OTP-5210
如果
/etc/hosts
指定了两个具有相同 IP 地址的主机(在单独的行上),则在 inet 配置期间,inet_db 只会注册最后一个主机。现在已对此进行了更正,以便两个别名都注册到相同的 IP 地址。自有 ID: OTP-5212 辅助 ID: seq7128
澄清了采用 I/O 列表的 BIF 的文档。这些是
list_to_binary/1
、port_command/2
、port_control/3
。添加了所有
is_*
BIF(例如is_atom/1
)的文档。移除了
erlang:float_to_binary/2
的文档,该函数在几个版本之前已从运行时系统中移除。内部 ID: OTP-5222