perl - 套接字句柄上不必要的 ioctl(n, TCGETS) 调用
问题描述
为什么 Perl5 似乎隐含地ioctl()
对各种文件句柄运行不必要的 tty 检查?
据我了解,这是 Perl5 的长期特性,似乎没有人考虑对其进行更改。ioctl()
当我说更改时,我的意思是在您知道不是 tty 句柄的文件句柄上“对Perl5 进行更改以促进启用或禁用此类tty 检查”。
我有一个 TCP/IP 套接字程序,在accept()
新套接字返回后,下面strace
显示了ioctl()
在新句柄上调用的 s。在这种情况下,ioctl()
调用是对 CPU 和负载的浪费。当然,如果accept()
andioctl()
只被调用一次,那没什么意义。然而,随着时间的推移,多个进程、多个ioctl()
调用......这一切都加起来了。
有没有一种现有的方法来明确禁用ioctl()
对文件句柄和套接字等的这种多余的 tty 检查?
如果它不能被禁用,是否有人认为这种禁用/启用检查的上下文能力是值得的?
这是strace
显示客户端套接字初始连接的摘录:
18:21:59.818126 select(8, [6], NULL, NULL, {tv_sec=10, tv_usec=0}) = 1 (in [6], left {tv_sec=9, tv_usec=999997})
18:21:59.818321 accept4(6, {sa_family=AF_INET, sin_port=htons(56124), sin_addr=inet_addr("127.0.0.1")}, [4096->16], SOCK_CLOEXEC) = 7
18:21:59.818419 fcntl(7, F_SETFD, FD_CLOEXEC) = 0
18:21:59.818453 ioctl(7, TCGETS, 0x7ffff5befcd0) = -1 ENOTTY (Inappropriate ioctl for device)
解决方案
所以你认为应该有一种方法告诉 Perl 检查句柄是否是一个套接字,以跳过执行与套接字无关的代码。
您不必告诉 Perl 这样做;它应该是自动的。它是自动的。调用ioctl
是那个检查。
我认为有问题的调用来自这个用于isatty
检查应该使用哪种缓冲的子。如果是这样,则调用 toioctl
用于检查句柄是否为套接字,或者是否跳过与套接字无关的执行代码。
您是否建议有更好的方法来检查文件句柄是否是套接字?
推荐阅读
- python - 根据另一列覆盖数据框中的数据
- c - 为什么将编译时静态字符串作为参数传递给字符串格式化函数,而不是将其包含在格式字符串中?
- r - 有没有办法“合并”两列,其中新列的值是具有特定值的原始列的名称,分组明智?
- javascript - 数据表显示条目和搜索功能不起作用
- c# - 具有无法正确关闭 SQL 连接的 ac# 代码(可能)
- css - 当我切换类时,我需要什么代码才能显示正面类?
- r - 使用 mutate 和 case_when 的用户定义函数
- java - 将字符串从活动传递到片段
- arrays - 在 Rust 中,我可以在不硬编码值的情况下实例化我的 const 数组吗?编译时评估?
- quantlib - 使用哪种利率来计算 IV:FlatForward 没有意义?