【发布时间】:2021-12-05 08:30:23
【问题描述】:
为什么 Perl5 似乎隐含地对各种文件句柄运行不必要的 ioctl() tty 检查?
据我了解,这是 Perl5 的长期特性,似乎没有人考虑对其进行更改。当我说更改时,我的意思是“对 Perl5 进行更改以促进对您知道不是 tty 句柄的文件句柄启用或禁用此类ioctl() tty 检查”。
我有一个 TCP/IP 套接字程序,在 accept() 返回一个新套接字后,下面的 strace 显示在新句柄上调用 ioctl()s。在这种情况下,ioctl() 调用是对 CPU 和负载的浪费。当然,如果accept() 和ioctl() 只被调用一次,那就没什么意义了。然而,随着时间的推移,多个进程、多个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)
【问题讨论】:
-
一个演示它的minimal reproducible example perl 脚本会很有用。并不是说我认为 ioctl 对性能有任何影响。还不如抱怨一下不必要的 fcntl。